Puede introducir el JSON en una instrucción SQL que extrae la información y la inserta en la tabla. Si los atributos JSON tienen exactamente el mismo nombre que las columnas de la tabla, puede hacer algo como esto:
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;
Se insertarán nuevos clientes, se actualizarán los existentes. La parte "mágica" es json_populate_recordset(null::customer, doc)
que genera una representación relacional de los objetos JSON.
Lo anterior asume una definición de tabla como esta:
create table customer
(
id integer primary key,
name text not null,
comment text
);
Si los datos se proporcionan como un archivo, primero debe colocar ese archivo en alguna tabla de la base de datos. Algo como esto:
create unlogged table customer_import (doc json);
Luego cargue el archivo en una sola fila de esa tabla, p. usando el \copy
comando en psql
(o lo que sea que ofrezca su cliente SQL):
\copy customer_import from 'customers.json' ....
Luego puede usar la declaración anterior, simplemente elimine el CTE y use la tabla de etapas:
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;