psql-guardar los resultados del comando en un archivo


Estoy usando psql \dt para listar todas las tablas en una base de datos y necesito guardar los resultados.

¿Cuál es la sintaxis para exportar los resultados de un comando psql a un archivo?

Author: pstanton, 2011-03-16

6 answers

De la ayuda de psql (\?):

\o [FILE] enviar todos los resultados de la consulta a file or / pipe

La secuencia de comandos se verá así:

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

db=>\o out.txt
db=>\dt
db=>\q

[wist@scifres ~]$ 
 323
Author: jhwist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 21:03:15

El comando psql \o ya fue descrito por jhwist.

Un enfoque alternativo es usar el comando COPY TO para escribir directamente en un archivo en el servidor. Esto tiene la ventaja de que se descarga en un formato fácil de analizar de su elección, en lugar del formato tabulado de psql. También es muy fácil importar a otra tabla/base de datos usando COPY FROM.

NB! Esto requiere privilegios de superusuario y escribirá en un archivo en el servidor.

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

Crea un archivo CSV con ';' como separador de campos.

Como siempre, vea la documentación para más detalles

 69
Author: intgr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-03 07:25:12

\copy que es un comando postgres puede funcionar para cualquier usuario. No sé si funciona para \dt o no, pero la sintaxis general se reproduce desde el siguiente enlace Postgres SQL copy syntax

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

Lo anterior guardará la salida de la consulta select en el nombre de archivo proporcionado como un archivo csv

EDITAR:

Para mi servidor psql funciona el siguiente comando esta es una versión anterior v8.5

copy (select * from table1) to 'full_path_filename' csv header;
 13
Author: Aakash Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-08 16:18:30

Asumo que existe algún comando interno de psql para esto, pero también podría ejecutar el comando script desde util-linux-ng paquete:

DESCRIPCIÓN Script hace un typescript de todo lo impreso en su terminal.

 1
Author: hlovdal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 20:55:25

Si tienes el siguiente error 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.

Puedes ejecutarlo de esta manera:

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

 1
Author: Daniil Mashkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-12 11:27:13

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; este comando se utiliza para almacenar toda la tabla como csv

 0
Author: Stephen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-12 07:40:13