Exportar tabela remota do Postgres para arquivo CSV na máquina local

15

Eu tenho acesso somente leitura a um banco de dados em um servidor remoto. Então, eu posso executar:

COPY products TO '/tmp/products.csv' DELIMITER ',';

Mas nesse servidor não tenho permissões para criar / salvar um arquivo, por isso preciso fazer isso na minha máquina local.

Quando me conecto ao banco de dados remoto, como posso executar um comando para salvar o arquivo na minha máquina local em vez do servidor remoto?

Ou, como posso executar um comando do Linux para conectar-se ao banco de dados remoto, executar uma consulta e salvar a saída como um arquivo na minha máquina local?

tasmaniski
fonte

Respostas:

29

Ambas as abordagens já sugeridas parecem ser desnecessariamente complicadas.

Basta usar psqlo \copycomando interno, que funciona exatamente do lado do servidor, COPYmas faz uma cópia pelo protocolo de conexão com o cliente e usa os caminhos do cliente.

Por ser um psqlcomando de barra invertida, você omite o ponto e vírgula à direita, por exemplo:

\copy products TO '/tmp/products.csv' CSV DELIMITER ','

Veja a \copyentrada no manual para o psqlcomando e a documentação do COPYcomando para mais detalhes.

Assim como COPYvocê pode usar \copycom uma (SELECT ...)consulta em vez de um nome de tabela ao copiar dados para fora (mas não para dentro).


Uma alternativa geralmente inferior que pode ser útil em algumas situações limitadas é usar:

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'

e use o -oredirecionamento de saída de sinalizador ou shell para gravar a saída em um arquivo. Você quase sempre deve usar \copyde preferência para isso.

Craig Ringer
fonte
Mas isso não permite transações :(
Reza S
Hum, com certeza. Use um documento aqui para alimentar psqlum script, começando com BEGIN, executando seus \copycomandos e, em seguida, a COMMIT. Ou use psql -fpara executar um script em vez de usar um documento aqui.
Craig Ringer
Obrigado por voltar ... isso é o que eu acabei fazendo e funcionou =)
Reza S
Você pode usar -Aem vez de -P format=unalignede também eu acho que você precisa de um-P fieldsep=,
Evan Carroll
2

O comando Linux é:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'
tasmaniski
fonte
1
Isso não produzirá CSV, produzirá saída de texto formatado. Se você adicionasse -t -P format=unaligned a esse comando, obteria algo um pouco mais próximo, como CSV delimitado por buggy, mas os pipes no texto não seriam escapados, por isso seria inválido.
Craig Ringer
Ah, você também desejaria, -P fieldsep=','exceto que isso seria ainda mais provável de causar erros devido à falta de escape. -P fieldsep_zero=onseria bom se você não se importasse em analisar texto delimitado por bytes nulos, pois bytes nulos não podem ocorrer psqlnaturalmente na saída.
Craig Ringer