Можете да подадете 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
);
Ако данните са предоставени като файл, първо трябва да поставите този файл в някаква таблица в базата данни. Нещо като това:
create unlogged table customer_import (doc json);
След това качете файла в един ред от тази таблица, напр. като използвате \copy
команда в 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;