Как импортировать файл JSON в PostgreSQL?
например у меня есть файл customers.json
который является массивом объектов (строго сформированных) , и это довольно просто (без вложенных объектов), как это (что важно: это уже включает идентификаторы):
[
{
"id": 23635,
"name": "Jerry Green",
"comment": "Imported from facebook."
},
{
"id": 23636,
"name": "John Wayne",
"comment": "Imported from facebook."
}
]
и я хочу импортировать их все в мою БД postgres в таблицу customers
.
я нашел несколько довольно сложных способов, когда я должен импортировать его как столбец JSON в таблицу, такую как imported_json
и столбец с именем data
с объектами, перечисленными там, а затем использовать sql для получения эти значения и вставьте его в реальную таблицу.
но есть ли простой способ импорта json в postgres без касания sql?
3 ответов
вы можете ввести JSON в инструкцию SQL, которая извлекает информацию и вставляет ее в таблицу. Если атрибуты JSON имеют точно такое же имя, как столбцы таблицы, вы можете сделать что-то вроде этого:
with customer_json (doc) as (
values
('[
{
"id": 23635,
"name": "Jerry Green",
"comment": "Imported from facebook."
},
{
"id": 23636,
"name": "John Wayne",
"comment": "Imported from facebook."
}
]'::json)
)
insert into customer (id, name, comment)
select p.*
from customer_json l
cross join lateral json_populate_recordset(null::customer, doc) as p
on conflict (id) do update
set name = excluded.name,
comment = excluded.comment;
новые клиенты будут вставлены, существующие будут обновлены. "Волшебная" часть-это json_populate_recordset(null::customer, doc)
который генерирует реляционное представление объектов JSON.
вышеизложенное предполагает определение таблицы, как это:
create table customer
(
id integer primary key,
name text not null,
comment text
);
если данные предоставлены в виде файла, вам нужно сначала поместить этот файл в некоторую таблицу в базе данных. Что-то вроде этого:--9-->
create unlogged table customer_import (doc json);
затем загрузите файл в одну строку этой таблицы, например, используя на psql
(или все, что предлагает ваш клиент SQL):
\copy customer_import from 'customers.json' ....
затем вы можете использовать вышеуказанный оператор, просто удалите CTE и используйте промежуточную таблицу:
insert into customer (id, name, comment)
select p.*
from customer_import l
cross join lateral json_populate_recordset(null::customer, doc) as p
on conflict (id) do update
set name = excluded.name,
comment = excluded.comment;
оказывается, есть простой способ импортировать многострочный объект JSON в столбец JSON в базе данных postgres с помощью инструмента командной строки psql, без необходимости явно вставлять JSON в инструкцию SQL. Техника документирована в postgresql docs, но это немного скрыто.
трюк состоит в том, чтобы загрузить JSON в переменную psql с помощью backticks. Например, учитывая многострочный файл JSON в / tmp / test.в JSON такие as:
{
"dog": "cat",
"frog": "frat"
}
мы можем использовать следующий SQL для загрузки его во временную таблицу:
sql> \set content `cat /tmp/test.json`
sql> create temp table t ( j jsonb );
sql> insert into t values (:'content');
sql> select * from t;
который дает результат:
j
────────────────────────────────
{"dog": "cat", "frog": "frat"}
(1 row)
вы также можете выполнять операции с данными напрямую:
sql> select :'content'::jsonb -> 'dog';
?column?
──────────
"cat"
(1 row)
под одеялом это is просто встраивание JSON в SQL, но гораздо аккуратнее позволить psql выполнять интерполяцию самостоятельно.
чтобы улучшить ваше решение в командной строке Windows psql, нам нужно использовать "type" вместо "cat" для чтения .файл json
i.e \установить содержимое type /tmp/test.json