Respostas:
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
\o
novamente desativa.
\?
não vai para o arquivo. :(
\o queries-output.txt
redireciona todos os comandos subseqüentes o / p para o arquivo nomeado queries-output.txt
e digitado \o
(no prompt do psql novamente) reverte esse comportamento de redirecionamento.
O \o
comando psql já foi descrito por jhwist.
Uma abordagem alternativa é usar o COPY TO
comando 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
\copy
que é 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;
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
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ê.
Presumo que exista algum comando psql interno para isso, mas você também pode executar o script
comando no pacote util-linux-ng :
DESCRIÇÃO Script faz um texto datilografado de tudo o que é impresso no seu terminal.
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.
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
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
cat sqlop
Feito! Obrigado! = D
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