JSON můžete vložit do příkazu SQL, který extrahuje informace a vloží je do tabulky. Pokud mají atributy JSON přesně stejný název jako sloupce tabulky, můžete udělat něco takového:
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;
Noví zákazníci budou vloženi, stávající budou aktualizováni. "Magická" část je json_populate_recordset(null::customer, doc)
který generuje relační reprezentaci objektů JSON.
Výše uvedené předpokládá definici tabulky takto:
create table customer
(
id integer primary key,
name text not null,
comment text
);
Pokud jsou data poskytnuta jako soubor, musíte tento soubor nejprve vložit do nějaké tabulky v databázi. Něco jako toto:
create unlogged table customer_import (doc json);
Poté soubor nahrajte do jednoho řádku této tabulky, např. pomocí \copy
příkaz v psql
(nebo cokoli, co váš SQL klient nabízí):
\copy customer_import from 'customers.json' ....
Pak můžete použít výše uvedený příkaz, stačí odstranit CTE a použít pracovní tabulku:
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;