Możesz podać kod JSON do instrukcji SQL, która wyodrębnia informacje i wstawia je do tabeli. Jeśli atrybuty JSON mają dokładnie taką samą nazwę jak kolumny tabeli, możesz zrobić coś takiego:
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;
Nowi klienci zostaną wprowadzeni, dotychczasowi zostaną zaktualizowani. Część „magiczna” to json_populate_recordset(null::customer, doc)
który generuje relacyjną reprezentację obiektów JSON.
Powyższe zakłada taką definicję tabeli:
create table customer
(
id integer primary key,
name text not null,
comment text
);
Jeśli dane są dostarczane jako plik, musisz najpierw umieścić ten plik w jakiejś tabeli w bazie danych. Coś takiego:
create unlogged table customer_import (doc json);
Następnie wgraj plik do jednego wiersza tej tabeli, np. używając \copy
polecenie w psql
(lub cokolwiek oferuje klient SQL):
\copy customer_import from 'customers.json' ....
Następnie możesz użyć powyższego oświadczenia, po prostu usuń CTE i użyj tabeli pomostowej:
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;