2012-06-25 19 views
8

Espero que no me falta algo muy obvio aquí,
Quiero obtener la salida JSON de una función postgres (imagino que muchos otros ya la han necesitado) y me gustaría instalar una extensión de las funciones contrib en mi servidor,Salida JSON en Postgresql

¿Hay alguna forma de obtener salida JSON de las funciones sql o plpgsql (o con la ayuda de db-server-side python)? Específicamente, quiero obtener mis resultados record[] como JSON.

Respuesta

6

Existe soporte integrado para JSON desde PostgreSQL 9.2 y ha aumentado con muchas otras características en versiones más recientes (por ejemplo: JSON functions in PostgreSQL 0.4).

Especialmente, el row_to_json convierte un registro en un objeto JSON y el array_to_json convierte las matrices en matrices JSON.

Por ejemplo, ambas funciones se pueden combinar para convertir fácilmente los resultados de una consulta SELECT en JSON:

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

Como yo lo entiendo, este es el soporte para un tipo JSON, que sostiene con formato JSON 'Text' y valida esto, no produce salida JSON. – Ali

+1

¿Has verificado los ejemplos en el primer enlace? Hay funciones 'query_to_json()', 'array_to_json()' y 'record_to_json()' que toman la entrada según sus nombres y la convierten en JSON. – madth3

+0

Tienes razón, me perdí la función 'row_to_json', esto puede resolver mi problema, gracias. – Ali

2

El plpython plug-in sin duda le permite hacer esto utilizando la biblioteca de Python json.

se puede hacer algo como esto:

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

    import json; 
    jsonStr = json.dumps(myrecord) 

$$ LANGUAGE plpythonu; 
+1

Gracias, el problema es que los resultados de las consultas SQL (registros AKA) no son serializables como lo son, alguien tiene que tomarse el tiempo para "limpiarlos" para conformarse, y si quisiera hacer eso, será mejor que lo haga en mi código python real, y no molestarme en cargar el pobre servidor db con esto. – Ali

2

En el servidor de instalación:
sudo apt-get install postgresql-plpython-9.4

A continuación, en el servidor de Postgres:

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; 
Cuestiones relacionadas