ОШИБКА: отсутствуют данные для столбца при использовании COPY FROM PROGRAM в psql

я пытаюсь импортировать данные из cURL с помощью следующей команды в psql:

COPY testtable FROM PROGRAM 'curl https://.....'

Это данные в URL:

[{date:20201006T120000Z,uri:secret,val:1765.756},{date:20201006T120500Z,uri:secret,val:2015.09258},{date:20201006T121000Z,uri:secret,val:2283.0885}]

Но psql возвращает

ОШИБКА: отсутствуют данные для столбца uri

Я пытался скопировать его на таблицы со столбцами в виде текста и формата json. Также пытался добавить (DELIMITER ','), но это возвращает

ОШИБКА: дополнительные данные после последнего ожидаемого столбца

я чувствую, что проблема может быть вызвана [] в начале и конце данных, но я не уверен.

Это определения таблиц, которые я использовал.

Таблица public.test_table

Column Type Modifiers
date text not null
uri text
val text

Индексы: test_table_pkey PRIMARY KEY, btree (дата)

Таблица public.test_table2

Column Type Modifiers
date json
uri json
val json

person Lautaro Aguilera    schedule 11.02.2021    source источник
comment
Каково определение test_table?   -  person jjanes    schedule 11.02.2021
comment
@jjanes я только что отредактировал сообщение и добавил определения используемых таблиц.   -  person Lautaro Aguilera    schedule 13.02.2021


Ответы (1)


COPY поддерживает только CSV, текстовые и двоичные форматы. Он не поддерживает JSON. Он будет импортировать или экспортировать данные в поля json или из них целиком, но не будет их собирать или анализировать.

Вы можете использовать промежуточную таблицу с одной строкой и одним столбцом.

create temp table stage(x jsonb);

COPY stage FROM PROGRAM 'curl https://.....';

insert into test_table select f.* from stage,
   jsonb_populate_recordset(null::test_table, x) f;

Если бы PostgreSQL предлагал функцию pg_read_program(), вы могли бы использовать ее напрямую, а не создавать промежуточную таблицу. Но это не так (но вы можете сделать его на C или plpythonu или plperlu)

person jjanes    schedule 13.02.2021