Puoi inserire il JSON in un'istruzione SQL che estrae le informazioni e le inserisce nella tabella. Se gli attributi JSON hanno esattamente il nome delle colonne della tabella, puoi fare qualcosa del genere:
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;
Verranno inseriti nuovi clienti, verranno aggiornati quelli esistenti. La parte "magica" è il json_populate_recordset(null::customer, doc)
che genera una rappresentazione relazionale degli oggetti JSON.
Quanto sopra presuppone una definizione di tabella come questa:
create table customer
(
id integer primary key,
name text not null,
comment text
);
Se i dati vengono forniti come file, devi prima inserire quel file in una tabella nel database. Qualcosa del genere:
create unlogged table customer_import (doc json);
Quindi carica il file in una singola riga di quella tabella, ad es. usando il \copy
comando in psql
(o qualunque cosa il tuo client SQL offra):
\copy customer_import from 'customers.json' ....
Quindi puoi utilizzare l'istruzione sopra, rimuovere semplicemente il CTE e utilizzare la tabella di 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;