PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come posso importare un file JSON in PostgreSQL?

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;