Проблема с копированием файла JSON как одной строки в таблицу в PostgreSQL - PullRequest
0 голосов
/ 18 октября 2018

У меня есть простой документ JSON "example_1.JSON:

{
"fruit": "Apple",
"size": "Large",
"color": "Red"
}

Я создал временную таблицу" temp_json ", чтобы скопировать в нее файл:

CREATE TEMP TABLE temp_json (mydata text);

Я скопировалJSON-файл, используя следующую инструкцию:

COPY temp_json from 'C:\Program Files\PostgreSQL\9.5\data\example_1.JSON';

Это нормально для части копирования. Когда я вставляю значения из временной таблицы в свою таблицу базы данных "jsontable", вставка происходит без ошибок, но этовставляет значения JSON в несколько строк в моей таблице базы данных !!! Моя таблица базы данных создается следующим образом:

CREATE TABLE public.jsontable (
  id bigint NOT NULL DEFAULT nextval('jsontable_id_seq'::regclass),
  jsondata jsonb,
  CONSTRAINT jsontable_pkey PRIMARY KEY (id)
);

Оператор вставки из временной таблицы в jsontable:

INSERT INTO jsontable(jsondata) SELECT to_jsonb(mydata::text) FROM temp_json;

Но когда я выбираю строки из jsontable, я не получаю значения JSON в одной строке!

SELECT * FROM jsontable;

enter image description here

Любые предложения для решенияэта проблема?

1 Ответ

0 голосов
/ 18 октября 2018

У вас есть два варианта.Управляйте данными из исходного файла, то есть предварительно отформатируйте содержимое файла, чтобы они скопировались в одну строку перед копированием.

Другой вариант может заключаться в объединении строк с использованием string_agg.Чтобы поддерживать порядок, я бы предложил вам иметь столбец идентификаторов по умолчанию в вашей временной таблице.

create sequence seq_temp_json;

CREATE temp TABLE temp_json 
  ( 
     id     INT DEFAULT NEXTVAL('seq_temp_json'::regclass), 
     mydata TEXT 
  ); 

Теперь загрузите временную таблицу и проверьте порядок, порядок json должен быть в порядке возрастания идентификатора..

  COPY temp_json(mydata) from 'C:\Program Files\PostgreSQL\9.5\data\example_1.JSON';

knayak=# select * from temp_json;
 id |      mydata
----+-------------------
  1 | {
  2 | "fruit": "Apple",
  3 | "size": "Large",
  4 | "color": "Red"
  5 | }
(5 rows)

Загрузить JSON в основную таблицу

INSERT INTO jsontable ( jsondata ) 
SELECT   string_agg( mydata ,e'\n' ORDER BY id)::jsonb 
FROM     temp_json;

Теперь в столбце содержится полный JSONB.

knayak=# select * from jsontable;
 id |                      jsondata
----+-----------------------------------------------------
  6 | {"size": "Large", "color": "Red", "fruit": "Apple"}
(1 row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...