Como exportar tabela como CSV com títulos no Postgresql?

418

Estou tentando exportar uma tabela do PostgreSQL com títulos para um arquivo CSV via linha de comando, no entanto, consigo exportar para arquivo CSV, mas sem títulos.

Meu código é o seguinte:

COPY products_273 to '/tmp/products_199.csv' delimiters',';
Elitmiar
fonte
Você está usando um postgres> = 8.1?
Dana the Sane
1
Acho que vou fazer um plano para upgrad para a versão mais recente, vai tornar a vida muito mais fácil
Elitmiar
1
Veja também stackoverflow.com/q/1517635/287948
Peter Krauss

Respostas:

595
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

conforme descrito no manual .

Milen A. Radev
fonte
7
Esteja ciente de que o argumento HEADER não foi introduzido até 8.1.
Dana the Sane
7
O que é, digamos, um pouco enferrujado.
Milen A. Radev
65
Nota COPYrequer privilégios de administrador. Use \COPYse você tiver problemas.
FNY
5
isso pode gerar uma saída não conforme, é melhor usar "FORMAT csv" que "DELIMITER ','". não sei qual versão que chegou embora
grahamrhay 23/09/2015
37
Para v9.5, o comando é agoraCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal
223

Na linha de comando do psql:

\COPY my_table TO 'filename' CSV HEADER

sem ponto e vírgula no final.

Laurent Debricon
fonte
22
esta versão é de longe o melhor que o COPYcomando requer acesso de administrador
Matthew O'Riordan
2
Também com a psqlabordagem, é possível salvar a saída em qualquer lugar ao qual tenha acesso. Eu apenas usei a psqlabordagem para obter dados de um servidor remoto em um arquivo local. Muito liso.
21814 Ian Gow
Muito melhor, especialmente ao salvar em um diretório ao qual você tem acesso, mas o usuário do postgres não.
21415 Steve
2
@arilwan Use pg_dump -h remote | pg_restore -h localhost.
Ian Gow
4
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
Juha Palomäki
122

em vez de apenas o nome da tabela, você também pode escrever uma consulta para obter apenas os dados da coluna selecionados.

COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

com privilégio de administrador

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
Dhruvil Thaker
fonte
Não acredito que você precise do ponto e vírgula final na versão psql do comando ( \COPY ...). E pelo menos na minha versão do psql (9.5.2), não era necessário especificar 'DELIMITER'; o padrão era uma vírgula.
User1071847
como a mudança de sintaxe se eu estou copiando a partir de CSV a mesa para campos selecionados
user269867
99

Quando não tenho permissão para gravar um arquivo no Postgres, acho que posso executar a consulta na linha de comando.

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv
Brian
fonte
7
O melhor para "qualquer ambiente". Melhor para 1. Não precisa de permissões especiais no Postgresql ou no cliente; 2. pode usar caminho relativo; e 3. é seguro para o formato CSV real (cotações seguras).
Peter Krauss
34

Isso funciona

psql dbname -F , --no-align -c "SELECT * FROM TABLE"
jordg
fonte
10
Agradável. Observe que isso não parece escapar vírgulas dentro dos campos que os contêm.
usar o seguinte
Eu gosto disso, sem o -F ,, e uso |como separador. Obrigado!
dsummersl
2
Não é isso que é comumente considerado como um recurso de exportação, apenas a exibição de dados controlada. A diferença é leve, mas importante: esta é mais concebido para ser lido por um ser humano do que a COPYdeclaração que cria um arquivo para ser reutilizado
Romain G
7
PERIGO não é para o formato CSV, não funciona para matrizes ou texto com ",". Não faz cotação CSV adequada. Use a resposta de @ Brian.
Peter Krauss
8

Para a versão 9.5 que eu uso, seria assim:

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
maytham-ɯɐɥʇʎɐɯ
fonte
7

Esta solução funcionou para mim usando \copy.

psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"
Atihska
fonte
4

A maneira mais simples (usando psql) parece ser usando o --csvsinalizador:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'
Yan Foto
fonte
Isso funciona apenas no PostgreSQL versão 12+
Dirk
3

Aqui está como eu consegui funcionar o shell de energia usando o pgsl connnect para um banco de dados Heroku PG:

Eu tive que primeiro mudar a codificação do cliente para utf8 assim: \encoding UTF8

Em seguida, despejou os dados em um arquivo CSV:

\copy (SELECT * FROM my_table) TO  C://wamp64/www/spider/chebi2/dump.csv CSV DELIMITER '~'

Eu usei ~ como delimitador porque não gosto de arquivos CSV, geralmente uso arquivos TSV, mas ele não me permite adicionar '\ t' como delimitador, então usei ~ porque é um caractere raramente usado.

Horse O'Houlihan
fonte
0

copiar (qualquer dado de consulta SQL quer exportar) para 'fileablsoutepathwihname' delimiter '', 'header csv;

Usando isso, você também pode exportar dados.

user3767321
fonte
0

Estou postando esta resposta porque nenhuma das outras respostas aqui realmente funcionou para mim. Não pude usar COPYno Postgres porque não tinha as permissões corretas. Então, escolhi "Exportar linhas da grade" e salvei a saída como UTF-8.

A psqlversão dada por @Brian também não funcionou para mim, por um motivo diferente. O motivo pelo qual não funcionou é que, aparentemente, o prompt de comando do Windows (eu estava usando o Windows) estava interferindo com a codificação por conta própria. Eu continuei recebendo este erro:

ERRO: caractere com a sequência de bytes 0x81 na codificação "WIN1252" não tem equivalente na codificação "UTF8"

A solução que acabei usando foi escrever um pequeno script JDBC (Java) que leu o arquivo CSV e emitiu instruções de inserção diretamente na minha tabela do Postgres. Isso funcionou, mas o prompt de comando também teria funcionado se não estivesse alterando a codificação.

Tim Biegeleisen
fonte
0

Tente o seguinte: "COPY products_273 FROM '\ tmp \ products_199.csv' DELIMITER ',' CSV HEADER"

Mohit Singh
fonte