Existe uma maneira de exportar dados da tabela do postgres como json para um arquivo? Eu preciso que a saída seja linha por linha, como:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
EDIT: versão do postgres: 9.3.4
fonte
Existe uma maneira de exportar dados da tabela do postgres como json para um arquivo? Eu preciso que a saída seja linha por linha, como:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
EDIT: versão do postgres: 9.3.4
Tente aqui para obter uma introdução básica a PostgreSQL
e JSON
.
Além disso, a documentação do PostgreSQL é muito boa, então tente aqui . Confira a pretty_bool
opção.
Sua pergunta original era "Existe uma maneira de exportar os dados da tabela do postgres como JSON
". Você queria neste formato
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
Eu não tinha uma instância em execução, PostgreSQL
então baixei, compilei e instalei a 9.4.
Para responder a isso, CREATE
editei uma tabela (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');
Então, para verificar:
test=# select * from fred;
mary | jimmy | paulie
------+-------+------------------
2 | 43 | asfasfasfd
3 | 435 | ererere
6 | 43343 | eresdfssfsfasfae
Então eu emiti 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=#
Então, fechei o psql e listei o arquivo 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]$
(você pode experimentar a saída de
COPY (SELECT ROW_TO_JSON(t, TRUE) -- <-- Note addition of "TRUE" here!
quando quiser).
Foi apontado por @ offby1 que a saída (embora corresponda à pergunta do OP) não está correta JSON
. O @EvanCarroll apontou que \o
também é uma maneira de gerar um arquivo, então eu combinei as soluções para essas duas imperfeições nesta declaração (com a ajuda daqui ):
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
dá:
[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 , há o \
problema de barra invertida ( ) mencionado por @AdamGent em seu post. Isso foi um pouco complicado, mas é possível sem recorrer ao processamento pós-consulta. Voilà:
INSERT INTO fred VALUES (35, 5, 'wrew\sdfsd');
INSERT INTO fred VALUES (3, 44545, '\sdfs\\\sfs\\gf');
E usar REGEXP_REPLACE assim (observe o cast :: TEXT) remove as barras negras em excesso.
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
dá:
[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]$
(ps Quanto ao comentário de @ Zoltán - isso pode ser uma versão - não é possível reproduzir!).
backslash
em suas colunas !!!! Leia atentamente o documento COPY, pois ele faz coisas especiais para osbackslash
caracteres (como adicionar outra barra invertida).Se você estiver usando
psql
, não há motivo para usá\COPY
-lo.Este é o mesmo método que usamos para obter png / jpgs / tifs do banco de dados com o PostGIS para testes rápidos e também para gerar arquivos de script com extensões do PostgreSQL.
fonte
psql
comandos -native-é a maneira mais fácil de copiar para o caminho relativo ! PS: existe uma "maneira terminal" de usar o comando COPY real com caminho relativo, veja aqui .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 mim @ resposta de Verace não manteve os nomes das colunas, mas os nomes padrão atribuídos (
f1
,f2
, etc.) em vez. Estou usando o PostgreSQL 9.1 com a extensão JSON .Se você deseja exportar a tabela inteira, não há necessidade de uma subconsulta. Além disso, este irá manter os nomes das colunas. Eu usei a seguinte consulta:
fonte
CREATE TABLE fred (mary INT, jimmy INT, paulie VARCHAR(20));
eo resultado:{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
- nomes dos campos são mary, jimmy, Paulie ... e NÃO (f1
,f2
., etc) ...Vou acrescentar uma advertência especial à resposta de Verace . Você precisa fazer o pós-processamento no arquivo JSON transmitido se você tem colunas de texto com caracteres de barra invertida:
\
.Caso contrário, você será duplicado (
\
->\\
) na melhor das hipóteses e completamente inválido no JSON na pior, ou seja:Este:
Torna-se
O que parece bom, mas é um JSON completamente inválido.
Você pode substituir o
\\
into\
pelo sed:Do Postgres COPY, onde eles mencionam:
fonte
Para uma solução genérica (MySQL, Postgres, SQLite ..) e gratuita para a qual você não precisa instalar nenhum software (exceto o Docker), consulte https://github.com/function61/sql2json
Divulgação completa: eu escrevi esse software.
fonte
Este é o único método que gera JSON (matriz de objetos) válido .
( fonte )
fonte