Копирование postgre json от внешнего файла

Я делаю следующие действия скачиваю файл и распаковываю:

/usr/bin/curl -s http://download.companieshouse.gov.uk/en_pscdata.html | grep --color=auto zip | grep "psc-snapshot" | awk -F\" '{print "http://download.companieshouse.gov.uk/"$2}' > download_list.txt
/usr/bin/wget -i download_list.txt
mkdir psc
unzip psc-snapshot-*_1of*.zip -d psc

В результате у меня 6 гб файл где каждая строчка это json я хочу ее обработать через postgre напрямую в базу данных

  1. создаю таблицу

    CREATE TEMP TABLE psc_data_staging_temp(row_data JSON);

  2. исполняю команду в linux:

    copy psc_data_staging_temp from program 'cat /opt/upload/psc/psc-snapshot-2021-11-25_1of20.txt'

2.1 или чуть изменненную в windows:

copy psc_data_staging_temp from program 'type D:\upload\persons-with-significant-control-snapshot-2021-11-18.txt'

и я получаю ошибку:

ERROR:  invalid input syntax for type json
DETAIL:  Escape sequence "\O" is invalid.
CONTEXT:  JSON data, line 1: ...9117131","data":{"address":{"address_line_1":"C\O...
COPY psc_data_staging_temp, line 275790, column row_data: "{"company_number":"09117131","data":{"address":{"address_line_1":"C\O Stocktake Uk Limited","address..."
SQL state: 22P02

Как ее избежать?


Ответы (2 шт):

Автор решения: Мелкий

COPY требует определённый формат данных.

Selects the data format to be read or written: text, csv (Comma Separated Values), or binary. The default is text.

Под text и binary подразумеваются строго те форматы данных, которые формирует сам COPY при выгрузке данных из таблицы, но не какие-то произвольные.

Реализуйте построчное чтение файла какими-то внешними средствами. Что-то небольшое можно было бы через pg_read_file прочитать и разбить на строки, но не 6гб файл.

→ Ссылка
Автор решения: Anton

Я смог решить эту проблему через cat

'COPY psc_data_staging_temp FROM program ''cat %s'''

Полный код выглядит так:

EXECUTE FORMAT('COPY psc_data_staging_temp FROM program ''cat %s''', in_path);
→ Ссылка