Du kan føre JSON ind i en SQL-sætning, der udtrækker oplysningerne og indsætter dem i tabellen. Hvis JSON-attributterne har nøjagtigt navnet som tabelkolonnerne, kan du gøre noget som dette:
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;
Nye kunder vil blive indsat, eksisterende vil blive opdateret. Den "magiske" del er json_populate_recordset(null::customer, doc)
som genererer en relationel repræsentation af JSON-objekterne.
Ovenstående forudsætter en tabeldefinition som denne:
create table customer
(
id integer primary key,
name text not null,
comment text
);
Hvis dataene leveres som en fil, skal du først lægge den fil ind i en tabel i databasen. Noget som dette:
create unlogged table customer_import (doc json);
Upload derefter filen i en enkelt række i den tabel, f.eks. ved hjælp af \copy
kommando i psql
(eller hvad din SQL-klient tilbyder):
\copy customer_import from 'customers.json' ....
Så kan du bruge ovenstående erklæring, bare fjerne CTE og bruge iscenesættelsestabellen:
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;