AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 90482
Accepted
AliBZ
AliBZ
Asked: 2015-01-29 15:22:28 +0800 CST2015-01-29 15:22:28 +0800 CST 2015-01-29 15:22:28 +0800 CST

Exportar tabela Postgres como json

  • 772

Existe uma maneira de exportar dados da tabela 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 postgres: 9.3.4

postgresql postgresql-9.3
  • 8 8 respostas
  • 101785 Views

8 respostas

  • Voted
  1. Best Answer
    Vérace
    2015-01-29T17:23:03+08:002015-01-29T17:23:03+08:00

    Tente aqui para uma introdução básica para PostgreSQLe JSON.

    Além disso, a documentação do PostgreSQL é muito boa, então experimente aqui . Confira a pretty_boolopção.

    Sua pergunta original era "Existe uma maneira de exportar dados da tabela 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, PostgreSQLentão baixei, compilei e instalei o 9.4.

    Para responder a isso, primeiro CREATEed 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');
    

    Em seguida, 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=# 
    

    Saí do 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 com 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 (enquanto corresponde à pergunta do OP) não está correta JSON. @EvanCarroll apontou que \otambém é uma maneira de enviar para um arquivo, então combinei as soluções para essas duas imperfeições nesta declaração (com 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 da 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 usando REGEXP_REPLACE assim (observe o cast ::TEXT) remove as barras pretas 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 coisa de versão - incapaz de reproduzir!).

    • 70
  2. Evan Carroll
    2017-01-08T21:10:23+08:002017-01-08T21:10:23+08:00

    Se você estiver usando psql, não há motivo para usar \COPY.

    \t
    \a
    \o file.json
    SELECT row_to_json(r) FROM my_table AS r;
    

    Este é o mesmo método que usamos para tirar png/jpgs/tifs do banco de dados com PostGIS para testes rápidos e também para gerar arquivos de script com extensões PostgreSQL.

    • 34
  3. Gunar Gessner
    2019-09-06T11:39:21+08:002019-09-06T11:39:21+08:00

    Por favor, encontre abaixo a única resposta que gera um JSON realmente válido (ou seja, matriz de objetos).

    \t
    \a
    \o data.json
    select json_agg(t) FROM (SELECT * from table) t;
    

    ( fonte )

    • 17
  4. Zoltán
    2015-07-07T08:39:50+08:002015-07-07T08:39:50+08:00

    Para mim, a resposta de @Vérace não manteve os nomes das colunas, mas atribuiu nomes padrão ( f1, f2, etc.) em vez disso. 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, isso manterá os nomes das colunas. Usei a seguinte consulta:

    COPY (SELECT row_to_json(t) FROM fred as t) to '/home/pol/Downloads/software/postgres/inst/myfile';
    
    • 9
  5. Adam Gent
    2016-08-25T18:56:15+08:002016-08-25T18:56:15+08:00

    Vou adicionar uma ressalva especial à resposta de Verace . Você precisa fazer o pós-processamento no arquivo JSON de saída se tiver colunas de texto com caracteres de barra invertida:\ .

    Caso contrário, você obterá duplicado ( \-> \\) na melhor das hipóteses e JSON completamente inválido na pior das hipóteses, ou seja:

    Este:

    { "f1" : "crap\""}.
    

    Torna-se

    { "f1" : "crap\\""}.
    

    O que parece bom, mas é JSON completamente inválido.

    Você pode substituir o \\into \por sed:

    sed -i -e 's/\\\\/\\/g' PG_OUT_JSON_FILE.json
    

    Do Postgres COPY onde eles mencionam:

    Atualmente, COPY TO nunca emitirá uma sequência de barra invertida octal ou de dígitos hexadecimais, mas usa as outras sequências listadas acima para esses caracteres de controle. Qualquer outro caractere de barra invertida que não seja mencionado na tabela acima será usado para representar a si mesmo. No entanto, tome cuidado ao adicionar barras invertidas desnecessariamente, pois isso pode produzir acidentalmente uma string correspondente ao marcador de fim de dados (.) ou a string nula (\N por padrão). Essas strings serão reconhecidas antes que qualquer outro processamento de barra invertida seja feito.

    É altamente recomendável que os aplicativos que geram dados COPY convertam as novas linhas de dados e os retornos de carro para as sequências \n e \r, respectivamente. Atualmente, é possível representar um retorno de carro de dados por uma barra invertida e um retorno de carro, e representar uma nova linha de dados por uma barra invertida e uma nova linha. No entanto, essas representações podem não ser aceitas em versões futuras. Eles também são altamente vulneráveis ​​à corrupção se o arquivo COPY for transferido entre máquinas diferentes (por exemplo, do Unix para o Windows ou vice-versa).

    COPY TO terminará cada linha com uma nova linha no estilo Unix ("\n"). Em vez disso, os servidores executados no Microsoft Windows produzem retorno de carro/nova linha ("\r\n"), mas apenas para COPIAR para um arquivo de servidor; para consistência entre plataformas, COPY TO STDOUT sempre envia "\n" independentemente da plataforma do servidor. COPY FROM pode manipular linhas que terminam com novas linhas, retornos de carro ou retorno de carro/novas linhas. Para reduzir o risco de erro devido a novas linhas sem barra invertida ou retornos de carro que deveriam ser dados, COPY FROM reclamará se as terminações de linha na entrada não forem todas iguais.

    • 8
  6. joonas.fi
    2016-12-23T10:05:05+08:002016-12-23T10:05:05+08:00

    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.

    • 1
  7. Daniel C. Moura
    2021-12-22T04:24:57+08:002021-12-22T04:24:57+08:00

    Isso é muito fácil de conseguir com spyql :

    $ psql -U my_user -h my_host -c "SELECT * FROM my_users" --csv my_db | spyql "SELECT * FROM csv TO json"
    {"id": 1, "name": "David"}
    {"id": 2, "name": "James"}
    {"id": 3, "name": "Joana"}
    {"id": 4, "name": "Hellen"}
    

    Estamos usando o psql para exportar uma consulta/tabela para CSV e, em seguida, o spyql para converter as linhas CSV em json.

    Para o registro, criei uma tabela de amostra com o seguinte comando SQL:

    CREATE TABLE my_users AS
    SELECT *
    FROM (VALUES (1, 'David'), (2, 'James'), (3, 'Joana'), (4, 'Hellen')) AS t(id, name);
    

    Isenção de responsabilidade: eu sou o autor do spyql

    • 1
  8. adrock20
    2022-02-20T08:01:39+08:002022-02-20T08:01:39+08:00

    Variante da resposta de @gunar-gessner com mas com arquivo de saída especificado embutido

    \t
    \a
    select json_agg(t) FROM (SELECT * from table) t \g data.json
    
    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve