Você pode alimentar o JSON em uma instrução SQL que extrai as informações e as insere na tabela. Se os atributos JSON tiverem exatamente o nome das colunas da tabela, você pode fazer algo assim:
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;
Novos clientes serão inseridos, os existentes serão atualizados. A parte "mágica" é o
json_populate_recordset(null::customer, doc)
que gera uma representação relacional dos objetos JSON. O acima assume uma definição de tabela como esta:
create table customer
(
id integer primary key,
name text not null,
comment text
);
Se os dados forem fornecidos como um arquivo, você precisa primeiro colocar esse arquivo em alguma tabela do banco de dados. Algo assim:
create unlogged table customer_import (doc json);
Em seguida, carregue o arquivo em uma única linha dessa tabela, por exemplo. usando o
\copy
comando em psql
(ou o que seu cliente SQL oferece):\copy customer_import from 'customers.json' ....
Então você pode usar a declaração acima, basta remover o CTE e usar a tabela de teste:
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;