Du kan mata in JSON i en SQL-sats som extraherar informationen och infogar den i tabellen. Om JSON-attributen har exakt namnet som tabellkolumnerna kan du göra något så här:
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;
Nya kunder kommer att infogas, befintliga kommer att uppdateras. Den "magiska" delen är json_populate_recordset(null::customer, doc)
som genererar en relationsrepresentation av JSON-objekten.
Ovanstående förutsätter en tabelldefinition som denna:
create table customer
(
id integer primary key,
name text not null,
comment text
);
Om data tillhandahålls som en fil, måste du först lägga den filen i någon tabell i databasen. Något så här:
create unlogged table customer_import (doc json);
Ladda sedan upp filen till en enda rad i den tabellen, t.ex. med hjälp av \copy
kommando i psql
(eller vad din SQL-klient erbjuder):
\copy customer_import from 'customers.json' ....
Sedan kan du använda ovanstående uttalande, ta bara bort CTE och använd mellanställningstabellen:
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;