2012-06-25 16 views
8

Mam nadzieję, że nie brakuje tu czegoś bardzo oczywistego,
Chcę uzyskać wyjście JSON z funkcji postgres (wyobrażam sobie, że wiele innych już tego potrzebowało) i chętnie zainstaluję rozszerzenie funkcji contrib na moim serwerze,Wyjście JSON w Postgresql

Czy istnieje sposób uzyskania wyniku JSON z funkcji sql lub plpgsql (lub z pomocą pythona po stronie serwera)? W szczególności chcę uzyskać moje wyniki record[] jako JSON.

Odpowiedz

6

Jest wbudowana obsługa JSON od PostgreSQL 9.2 i została rozszerzona o wiele innych funkcji w nowszych wersjach (na przykład: JSON functions in PostgreSQL 0.4).

Specjalnie row_to_json konwertuje rekord na obiekt JSON, a array_to_json zamienia tablice na tablice JSON.

Na przykład, obie funkcje mogą być łączone z łatwością obrócić wyniki SELECT zapytania do JSON:

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

Jak rozumiem, jest to wsparcie dla typu JSON, który posiada json formatowany 'text' i potwierdza nie generuje wyjścia JSON. – Ali

+1

Czy sprawdziłeś przykłady w pierwszym linku? Istnieją funkcje 'query_to_json()', 'array_to_json()' oraz 'record_to_json()', które pobierają dane wejściowe zgodnie z ich nazwami i zmieniają je w JSON. – madth3

+0

Masz rację, przegapiłem funkcję 'row_to_json', to może rozwiązać mój problem, dziękuję. – Ali

2

plpython wtyczki z pewnością pozwala zrobić to za pomocą Pythonajson bibliotekę.

można zrobić coś takiego:

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

    import json; 
    jsonStr = json.dumps(myrecord) 

$$ LANGUAGE plpythonu; 
+1

Dzięki, problem polega na tym, że wyniki zapytań SQL (zapisy AKA) nie są serializowane przez sql, ponieważ ktoś musi poświęcić trochę czasu na "oczyszczenie" ich zgodności, a gdybym chciał to zrobić, lepiej zrobię to w mój rzeczywisty kod Pythona i nie przejmuj się ładowaniem tego biednego serwera db. – Ali

2

Na serwerze zainstalować:
sudo apt-get install postgresql-plpython-9.4

Następnie na serwerze PostgreSQL:

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; 
Powiązane problemy