psql - salva os resultados do comando em um arquivo

283

Estou usando o psql \dtpara listar todas as tabelas em um banco de dados e preciso salvar os resultados.

Qual é a sintaxe para exportar os resultados de um comando psql para um arquivo?

pstanton
fonte
1
Consulte também stackoverflow.com/questions/3939329/… .
Matt Solnit

Respostas:

478

Da ajuda do psql ( \?):

\ o [FILE] envia todos os resultados da consulta para arquivo ou canal

A sequência de comandos ficará assim:

[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal

db=>\o out.txt
db=>\dt
db=>\q
jhwist
fonte
1
eu chamo isso antes do \ dt ou em combinação? inclua sintaxe obrigado.
pstanton
118
Digitar \onovamente desativa.
Carl G
3
Infelizmente, a saída de \?não vai para o arquivo. :(
blitzen9872
a sua permissão perusual tipo negou diz tentar executar psql como administrador
Ajay Takur
1
Sim, \o queries-output.txtredireciona todos os comandos subseqüentes o / p para o arquivo nomeado queries-output.txte digitado \o(no prompt do psql novamente) reverte esse comportamento de redirecionamento.
hygull
95

O \ocomando psql já foi descrito por jhwist.

Uma abordagem alternativa é usar o COPY TOcomando para gravar diretamente em um arquivo no servidor. Isso tem a vantagem de ser despejado em um formato fácil de analisar de sua escolha - em vez do formato tabulado do psql. Também é muito fácil importar para outra tabela / banco de dados usando COPY FROM.

NB! Isso requer privilégios de superusuário e gravará em um arquivo no servidor .

Exemplo: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')

Cria um arquivo CSV com ';' como o separador de campos.

Como sempre, consulte a documentação para obter detalhes

intgr
fonte
Eu concordo @helvete, a abordagem aqui apresentada fornece mais poder para o usuário para a saída configure de forma mais personalizando
Nathan Benton
27

\copyque é um comando do postgres, pode funcionar para qualquer usuário. Não sei se funciona para \ dt ou não, mas a sintaxe geral é reproduzida no link a seguir Sintaxe de cópia do Postgres SQL

\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','

O exemplo acima salvará a saída da consulta de seleção no nome do arquivo fornecido como um arquivo csv

EDITAR:

Para o meu servidor psql, o seguinte comando funciona: esta é uma versão mais antiga v8.5

copy (select * from table1) to 'full_path_filename' csv header;
Aakash Gupta
fonte
Muito útil, obrigado. Mas a 'cópia' em '... copiar para ...' não é necessária - de fato, nas versões recentes, causa falha no comando.
Tom
Tom, acho que foi um erro de digitação. Editou o post com o que funciona no meu instalação pgsql 8.5ver
Aakash Gupta
Apenas uma observação rápida para quem tenta colar em uma instrução de várias linhas após \ copy e obtém erros de sintaxe confusos, como acabei de fazer. Você precisa continuar na mesma linha que \ copy.
whoasked
Existe uma maneira de desativar a \ copy? Descobri que, se eu executar uma instrução como no seu exemplo, e executar, por exemplo, selecione * dos usuários; que anexará os resultados ao arquivo mais recente que eu especifiquei, em vez de enviar para a tela. Obrigado.
raphael75 19/03
6

Use o parâmetro do comando pgsql.

-o, --output = FILENAME envia os resultados da consulta para o arquivo (ou | canal)

psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt
Yavuz
fonte
3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; este comando é usado para armazenar a tabela inteira como csv

Stephen
fonte
No postgres, COPY é melhor substituído por \ COPY para evitar a necessidade do db admin. No Windows, esse arquivo é colocado em C: \ tmp
/
3

Se você recebeu o seguinte erro ufgtoolspg=> COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';') ; ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

você pode executá-lo desta maneira:

psql somepsqllink_or_credentials -c "COPY (SELECT foo, bar FROM baz) TO STDOUT (format csv, delimiter ';')" > baz.csv

Daniil Mashkin
fonte
2

Use a consulta abaixo para armazenar o resultado no arquivo csv

\ copy (sua consulta) no cabeçalho csv 'caminho do arquivo';

Exemplo

\ copy (selecione o nome, o número da data do pedido da compra) para o cabeçalho '/home/ankit/Desktop/result.csv' cvs;

Espero que isso ajude você.

Er.Ankit H Gandhi
fonte
1

Presumo que exista algum comando psql interno para isso, mas você também pode executar o scriptcomando no pacote util-linux-ng :

DESCRIÇÃO Script faz um texto datilografado de tudo o que é impresso no seu terminal.

hlovdal
fonte
0

Essa abordagem funcionará com qualquer comando psql, do mais simples ao mais complexo, sem exigir nenhuma alteração ou ajuste no comando original.

NOTA: Para servidores Linux.


  • Salve o conteúdo do seu comando em um arquivo

MODELO

read -r -d '' FILE_CONTENT << 'HEREDOC'
[COMMAND_CONTENT]

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd

EXEMPLO

read -r -d '' FILE_CONTENT << 'HEREDOC'
DO $f$
declare
    curid INT := 0;
    vdata BYTEA;
    badid VARCHAR;
    loc VARCHAR;
begin
FOR badid IN SELECT some_field FROM public.some_base LOOP
    begin
    select 'ctid - '||ctid||'pagenumber - '||(ctid::text::point) [0]::bigint
        into loc
        from public.some_base where some_field = badid;
        SELECT file||' '
        INTO vdata
        FROM public.some_base where some_field = badid;
    exception
        when others then
        raise notice 'Block/PageNumber - % ',loc;
            raise notice 'Corrupted id - % ', badid;
            --return;
    end;
end loop;
end;
$f$;

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd
  • Execute o comando

MODELO

sudo -u postgres psql [some_db] -c "$(cat sqlcmd)" >>sqlop 2>&1

EXEMPLO

sudo -u postgres psql some_db -c "$(cat sqlcmd)" >>sqlop 2>&1

  • Ver / rastrear sua saída de comando

cat sqlop

Feito! Obrigado! = D

Eduardo Lucio
fonte
0

Abordagem para janela de encaixe

via comando psql

 docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt

ou consulta do arquivo sql

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
Roman Rhrn Nesterov
fonte