¿Cómo exportar tabla como CSV con encabezados en Postgresql?

418

Estoy tratando de exportar una tabla PostgreSQL con encabezados a un archivo CSV a través de la línea de comandos, sin embargo, consigo exportar a un archivo CSV, pero sin encabezados.

Mi código se ve de la siguiente manera:

COPY products_273 to '/tmp/products_199.csv' delimiters',';
Elitmiar
fuente
¿Estás usando un postgres> = 8.1?
Dana the Sane
1
Creo que haré un plan para actualizar a la versión más nueva, hará la vida mucho más fácil
Elitmiar el
1
Ver también stackoverflow.com/q/1517635/287948
Peter Krauss el

Respuestas:

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

como se describe en el manual .

Milen A. Radev
fuente
77
Tenga en cuenta que el argumento HEADER no se introdujo hasta 8.1.
Dana the Sane
77
Lo cual es, digamos, un poco oxidado.
Milen A. Radev el
65
Nota COPYrequiere privilegios de administrador. Úselo \COPYen su lugar si tiene problemas.
fny
55
esto puede proporcionarle resultados no conformes, mejor usar "FORMAT csv" que "DELIMITER ','". sin embargo
grahamrhay
37
Para v9.5, el comando ahora esCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal el
223

Desde la línea de comando psql:

\COPY my_table TO 'filename' CSV HEADER

sin punto y coma al final.

Laurent Debricon
fuente
22
esta versión es, con mucho, la mejor ya que el COPYcomando requiere acceso de administrador
Matthew O'Riordan
2
También con el psqlenfoque, uno puede guardar la salida en cualquier lugar al que tenga acceso. Acabo de utilizar el psqlenfoque para obtener datos de un servidor remoto en un archivo local. Muy hábil.
Ian Gow
Mucho mejor, especialmente al guardar en un directorio donde tiene acceso pero el usuario de postgres no.
Steve Bennett
2
@arilwan Use pg_dump -h remote | pg_restore -h localhost.
Ian Gow
44
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
Juha Palomäki
122

en lugar de solo el nombre de la tabla, también puede escribir una consulta para obtener solo los datos de columna seleccionados.

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

con privilegio de administrador

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
Dhruvil Thaker
fuente
No creo que necesite el punto y coma que termina en la versión psql del comando ( \COPY ...). Y al menos en mi versión de psql (9.5.2) no necesitaba especificar 'DELIMITER'; El valor predeterminado era una coma.
user1071847
cómo el cambio de sintaxis si estoy copiando desde CSV a la mesa para los campos seleccionados
user269867
99

Cuando no tengo permiso para escribir un archivo desde Postgres, encuentro que puedo ejecutar la consulta desde la línea de comandos.

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv
Brian
fuente
77
Lo mejor para "cualquier ambiente". Lo mejor para 1. No necesita permisos especiales en Postgresql o en el cliente; 2. puede usar la ruta relativa; y 3. es seguro para el formato CSV real (cotizaciones seguras).
Peter Krauss
34

Esto funciona

psql dbname -F , --no-align -c "SELECT * FROM TABLE"
jordg
fuente
10
Agradable. Tenga en cuenta que esto no parece escapar de las comas dentro de los campos que las contienen.
RecursivelyIronic
Me gusta esto, sin el -F ,, y lo uso |como separador. ¡Gracias!
dsummersl
2
Esto no es lo que comúnmente se considera como una función de exportación, solo visualización de datos controlada. La diferencia es ligera, pero importante: esto está más destinado a ser leído por un humano que la COPYdeclaración que crea un archivo para ser reutilizado
Romain G
77
PELIGRO no es para formato CSV, no funciona para matrices o texto con "," .. no haga una cita CSV adecuada. Usa la respuesta de @ Brian.
Peter Krauss
8

Para la versión 9.5 que uso, sería así:

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

Esta solución funcionó para mí 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
fuente
4

La forma más simple (usando psql) parece ser usando --csvflag:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'
Yan Foto
fuente
Eso solo funciona en PostgreSQL versión 12+
Dirk
3

He aquí cómo lo hice funcionar con Power Shell usando pgsl connnect a una base de datos Heroku PG:

Primero tuve que cambiar la codificación del cliente a utf8 así: \encoding UTF8

Luego volcó los datos a un archivo CSV esto:

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

Usé ~ como delimitador porque no me gustan los archivos CSV, por lo general uso archivos TSV, pero no me permite agregar '\ t' como delimitador, así que usé ~ porque es un carácter poco utilizado.

Caballo O'Houlihan
fuente
0

copie (anysql query datawanttoexport) a 'fileablsoutepathwihname' delimiter ',' csv header;

Usando esto, también puede exportar datos.

usuario3767321
fuente
0

Estoy publicando esta respuesta porque ninguna de las otras respuestas dadas aquí realmente funcionó para mí. No pude usarlo COPYdesde Postgres, porque no tenía los permisos correctos. Así que elegí "Exportar filas de cuadrícula" y guardé el resultado como UTF-8.

La psqlversión dada por @Brian tampoco funcionó para mí, por una razón diferente. La razón por la que no funcionó es porque aparentemente el símbolo del sistema de Windows (estaba usando Windows) se entrometía con la codificación por sí solo. Seguí recibiendo este error:

ERROR: el carácter con la secuencia de bytes 0x81 en la codificación "WIN1252" no tiene equivalente en la codificación "UTF8"

La solución que terminé usando fue escribir un breve script JDBC (Java) que leía el archivo CSV y emitía declaraciones de inserción directamente en mi tabla de Postgres. Esto funcionó, pero el símbolo del sistema también habría funcionado si no hubiera alterado la codificación.

Tim Biegeleisen
fuente
0

Pruebe esto: "COPIAR productos_273 DESDE '\ tmp \ products_199.csv' DELIMITER ',' CSV HEADER"

Mohit Singh
fuente