2012-06-25 18 views
8

Spero di non mancare qualcosa di molto ovvio,
Voglio ottenere l'output JSON da una funzione postgres (immagino che molti altri ne avessero già avuto bisogno) e sarei felice di installare un'estensione di funzioni contrib sul mio server,Uscita JSON in Postgresql

C'è un modo per ottenere l'output JSON dalle funzioni sql o plpgsql (o con l'aiuto di db-server-side python)? Nello specifico voglio ottenere i miei risultati record[] come JSON.

risposta

6

C'è un supporto integrato per JSON dal PostgreSQL 9.2 ed è aumentato con molte altre funzionalità nelle versioni più recenti (ad esempio: JSON functions in PostgreSQL 0.4).

In particolare, lo row_to_json converte un record in un oggetto JSON e lo array_to_json trasforma gli array in matrici JSON.

Per esempio, entrambe le funzioni possono essere combinati per trasformare facilmente i risultati di una query SELECT in JSON:

SELECT array_to_json(array_agg(row_to_json(t))) FROM 
    (SELECT col1, col2, col3 FROM example_table) t 
+0

quanto ho capito, questo è il supporto per un tipo di JSON, che detiene JSON formattato 'Text' e convalida esso, non produce output JSON. – Ali

+1

Hai controllato gli esempi nel primo link? Ci sono funzioni 'query_to_json()', 'array_to_json()' e 'record_to_json()' che prendono l'input secondo il loro nome e lo trasformano in JSON. – madth3

+0

Hai ragione, ho perso la funzione 'row_to_json', questo potrebbe risolvere il mio problema, grazie. – Ali

2

Il plugin plpython certamente ti permette di fare questo usando il pitonejson biblioteca.

si può fare qualcosa di simile:

CREATE OR REPLACE FUNCTION myschema.tojsonfunc() 
AS $$  

    import json; 
    jsonStr = json.dumps(myrecord) 

$$ LANGUAGE plpythonu; 
+1

Grazie, il problema è che i risultati delle query SQL (record AKA) non sono serializzabili come SQL, qualcuno deve prendersi il tempo per "pulirli" per conformarsi, e se volessi farlo, farei meglio a farlo il mio vero codice Python, e non mi preoccupo di caricare il povero server db con questo. – Ali

2

sul server di installazione:
sudo apt-get install postgresql-plpython-9.4

Poi sul Postgres server:

CREATE EXTENSION IF NOT EXISTS plpythonu; 
CREATE LANGUAGE plpythonu; 

CREATE OR REPLACE FUNCTION prettyprint_json(data text) 
RETURNS json 
AS $$ 
    import json 
    return json.dumps(json.loads(data), indent=4) 
$$ LANGUAGE plpythonu;