Anda dapat memasukkan JSON ke dalam pernyataan SQL yang mengekstrak informasi dan memasukkannya ke dalam tabel. Jika atribut JSON memiliki nama persis seperti kolom tabel, Anda dapat melakukan sesuatu seperti ini:
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;
Pelanggan baru akan dimasukkan, yang sudah ada akan diperbarui. Bagian "ajaib" adalah json_populate_recordset(null::customer, doc)
yang menghasilkan representasi relasional dari objek JSON.
Di atas mengasumsikan definisi tabel seperti ini:
create table customer
(
id integer primary key,
name text not null,
comment text
);
Jika data disediakan sebagai file, Anda harus terlebih dahulu memasukkan file itu ke dalam beberapa tabel di database. Sesuatu seperti ini:
create unlogged table customer_import (doc json);
Kemudian unggah file ke dalam satu baris tabel itu, mis. menggunakan \copy
perintah di psql
(atau apa pun yang ditawarkan klien SQL Anda):
\copy customer_import from 'customers.json' ....
Kemudian Anda dapat menggunakan pernyataan di atas, cukup hapus CTE dan gunakan tabel staging:
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;