U kunt de JSON invoeren in een SQL-instructie die de informatie extraheert en in de tabel invoegt. Als de JSON-attributen exact dezelfde naam hebben als de tabelkolommen, kunt u zoiets als dit doen:
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;
Nieuwe klanten worden toegevoegd, bestaande worden bijgewerkt. Het "magische" deel is de json_populate_recordset(null::customer, doc)
die een relationele weergave van de JSON-objecten genereert.
Het bovenstaande gaat uit van een tabeldefinitie zoals deze:
create table customer
(
id integer primary key,
name text not null,
comment text
);
Als de gegevens als een bestand worden verstrekt, moet u dat bestand eerst in een tabel in de database plaatsen. Zoiets als dit:
create unlogged table customer_import (doc json);
Upload het bestand vervolgens naar een enkele rij van die tabel, b.v. met behulp van de \copy
commando in psql
(of wat uw SQL-client ook aanbiedt):
\copy customer_import from 'customers.json' ....
Dan kunt u de bovenstaande verklaring gebruiken, verwijder gewoon de CTE en gebruik de staging-tabel:
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;