¿Hay alguna manera de exportar datos de la tabla postgres como json a un archivo? Necesito que la salida sea línea por línea, como:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
EDITAR: versión de postgres: 9.3.4
fuente
¿Hay alguna manera de exportar datos de la tabla postgres como json a un archivo? Necesito que la salida sea línea por línea, como:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
EDITAR: versión de postgres: 9.3.4
Pruebe aquí para una introducción básica a PostgreSQL
y JSON
.
Además, la documentación de PostgreSQL es bastante buena, así que pruébelo aquí . Mira la pretty_bool
opción.
Su pregunta original era "¿Hay alguna manera de exportar datos de la tabla de postgres como JSON
". Lo querías en este formato
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
No tenía una instancia en ejecución de, PostgreSQL
así que descargué, compilé e instalé 9.4.
Para responder esto, primero CREATE
edité una tabla (fred)
CREATE TABLE fred (mary INT, jimmy INT, paulie VARCHAR(20));
INSERT INTO fred VALUES (2, 43, 'asfasfasfd' );
INSERT INTO fred VALUES (3, 435, 'ererere' );
INSERT INTO fred VALUES (6, 43343, 'eresdfssfsfasfae');
Luego, para verificar:
test=# select * from fred;
mary | jimmy | paulie
------+-------+------------------
2 | 43 | asfasfasfd
3 | 435 | ererere
6 | 43343 | eresdfssfsfasfae
Entonces emití este comando
test=# COPY (SELECT ROW_TO_JSON(t)
test(# FROM (SELECT * FROM fred) t)
test-# TO '/paulstuff/sware/db/postgres/inst/myfile';
COPY 3
test=#
Luego salí de psql y enumeré el archivo myfile.
test=# \q
[pol@polhost inst]$ more myfile
{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
{"mary":3,"jimmy":435,"paulie":"ererere"}
{"mary":6,"jimmy":43343,"paulie":"eresdfssfsfasfae"}
[pol@polhost inst]$
(puede experimentar con la salida de
COPY (SELECT ROW_TO_JSON(t, TRUE) -- <-- Note addition of "TRUE" here!
en su tiempo libre).
@ Offby1 señaló que la salida (aunque corresponde a la pregunta del OP) no es correcta JSON
. @EvanCarroll señaló que \o
también es una forma de enviar a un archivo, por lo que combiné las soluciones a estos dos inconvenientes en esta declaración (con ayuda de aquí ):
test=# \o out.json
test=# SELECT array_to_json(array_agg(fred), FALSE) AS ok_json FROM fred;
-- <-- "TRUE" here will produce plus
("+) signs in the output. "FALSE"
is the default anyway.
test=# \o
da:
[pol@polhost inst]$ more out.json
ok_json
----------------------------------------------------------------------------------------------------------------------------------------------
[{"mary":2,"jimmy":43,"paulie":"asfasfasfd"},{"mary":3,"jimmy":435,"paulie":"ererere"},{"mary":6,"jimmy":43343,"paulie":"eresdfssfsfasfae"}]
(1 row)
[pol@polhost inst]$
FINALMENTE , existe el \
problema de la barra invertida ( ) aludido por @AdamGent en su publicación. Esto fue un poco complicado, pero es posible sin recurrir al procesamiento posterior a la consulta. Voilà:
INSERT INTO fred VALUES (35, 5, 'wrew\sdfsd');
INSERT INTO fred VALUES (3, 44545, '\sdfs\\\sfs\\gf');
Y al usar REGEXP_REPLACE de este modo (tenga en cuenta que cast :: TEXT) elimina el exceso de barras negras.
test=# \o slash.json
test=# SELECT REGEXP_REPLACE(ROW_TO_JSON(t)::TEXT, '\\\\', '\\', 'g')
test=# FROM (SELECT * FROM fred) AS t; -- I found that using a CTE was helpful for legibility
test=# \o
test=# \q
da:
[pol@polhost inst]$ more slash.json
regexp_replace
------------------------------------------------------
{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
{"mary":3,"jimmy":435,"paulie":"ererere"}
{"mary":6,"jimmy":43343,"paulie":"eresdfssfsfasfae"}
{"mary":35,"jimmy":5,"paulie":"wrew\sdfsd"}
{"mary":3,"jimmy":44545,"paulie":"\sdfs\\\sfs\\gf"}
(5 rows)
[pol@polhost inst]$
(PD: En cuanto al comentario de @ Zoltán, esto puede ser una versión, ¡no se puede reproducir!).
backslash
en sus columnas! Lea atentamente el documento COPY, ya que hace cosas especiales para losbackslash
caracteres (como agregar otra barra invertida).Si está usando,
psql
entonces no hay ninguna razón para usar\COPY
.Este es el mismo método que usamos para sacar png / jpgs / tifs de la base de datos con PostGIS para pruebas rápidas, y también para generar archivos de script con extensiones PostgreSQL.
fuente
psql
comandos nativos son la forma más fácil de copiar en la ruta relativa . PD: hay una "forma terminal" para usar el comando COPY real con ruta relativa, ver aquí .psql -h remotehost -d remote_mydb -U myuser -c "COPY (SELECT '{\"x\":1,\"y\":[\"a\",2]}'::json AS r) TO STDOUT" > ./relative_path/file.csv
Para mí la respuesta de @ Verace no mantuvo los nombres de las columnas, pero los nombres predeterminados asignados (
f1
,f2
, etc.) en su lugar. Estoy usando PostgreSQL 9.1 con la extensión JSON .Si desea exportar toda la tabla, no hay necesidad de una subconsulta. Además, este será mantener los nombres de columna. Usé la siguiente consulta:
fuente
CREATE TABLE fred (mary INT, jimmy INT, paulie VARCHAR(20));
y el resultado:{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
- nombres de campo son María, barreta, Paulie ... y NO (f1
,f2
., etc) ...Agregaré una advertencia especial a la respuesta de Verace . Que tiene que hacer el procesamiento posterior en el archivo JSON emitida si tiene columnas de texto con caracteres de barra invertida:
\
.De lo contrario, obtendrá duplicados (
\
->\\
) en el mejor de los casos y JSON completamente inválido en el peor, es decir:Esta:
Se convierte
Que se ve bien pero es completamente inválido JSON.
Puede reemplazar el
\\
en\
con sed:De Postgres COPY donde redondean mencionarlo:
fuente
Para obtener una solución genérica (MySQL, Postgres, SQLite ...) y gratuita para la que no tiene que instalar ningún software (excepto Docker), consulte https://github.com/function61/sql2json
Divulgación completa: escribí ese software.
fuente
Este es el único método que genera JSON (matriz de objetos) válidos .
( fuente )
fuente