Utilizzare JSON in PostgreSQL

ATTENZIONE! Il post ha più di 2 anni e le informazioni contenute potrebbero essere obsolete (ad esempio a causa di un aggiornamento di versione rispetto agli elementi descritti o links modificati da siti esterni).

Il tipo di dato JSON è stato introdotto dalla versione di PostgreSQL 9.2. Con la versione 9.4 sono state introdotte nuove funzionalità per la gestione di questo tipo di dati, oltre a migliorarne le performance.
Salvando i dati in questo formato è possibile quindi unire le funzionalità di un database relazionale con la flessibilità di un database NO-SQL (come ad esempio MongoDB).
Di seguito un rapido esempio da cui partire per i propri esperimenti.

Come prima cosa creiamo lo schema "demo" e la tabella "prova1", con sole due colonne: un id come chiave primaria e la colonna "dati" di tipo json.

CREATE SCHEMA demo;
CREATE TABLE demo.prova1
(
  id bigserial NOT NULL,
  dati jsonb,
  CONSTRAINT prova1_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);

Ora inseriamo un po' di dati. Il formato della colonna "dati" sarà un json standard:

INSERT INTO demo.prova1 (dati) VALUES ('{"nome": "mario", "cognome": "rossi"}');
INSERT INTO demo.prova1 (dati) VALUES ('{"nome": "marco", "cognome": "bianchi"}');
INSERT INTO demo.prova1 (dati) VALUES ('{"nome": "luca", "cognome": "rossi"}');
INSERT INTO demo.prova1 (dati) VALUES ('{"nome": "luca", "cognome": "bianchi"}');
INSERT INTO demo.prova1 (dati) VALUES ('{"nome": "mario", "cognome": "verdi"}');

A questo punto è possibile eseguire una semplice query per ricavare i dati, filtrando i risultati in base al valore della chiave "nome" all'interno del campo json.
Per farlo si utlizza la sintassi nome_colonna->>'nome_chiave':

SELECT * 
FROM demo.prova1
WHERE dati->>'nome' = 'mario'

Il risultato sarà il seguente:

id dati
1 {"nome": "mario", "cognome": "rossi"}
5 {"nome": "mario", "cognome": "verdi"}

 

LA FUNZIONE ROW_TO_JSON

Tra le funzione introdotte in PostgreSQL con la versione 9.4 ce n'è una molto interessante: ROW_TO_JSON.
Questa funzione permette infatti di ricavare tutta la riga in un unico json, molto utile per le applicazione che lo utilizzano nativamente:

SELECT ROW_TO_JSON(prova1) 
FROM demo.prova1
WHERE dati->>'nome' = 'mario'

I risultati saranno quindi formattati in questo modo:

row_to_json
{"dati":{"nome": "mario", "cognome": "rossi"},"id":1}
{"dati":{"nome": "mario", "cognome": "verdi"},"id":5}

 

 

 


Commenti