psql: guarda los resultados del comando en un archivo

283

Estoy usando psql \dtpara enumerar 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?

pstanton
fuente
1
Consulte también stackoverflow.com/questions/3939329/… .
Matt Solnit

Respuestas:

478

De la ayuda de psql ( \?):

\ o [FILE] envía todos los resultados de la consulta al archivo o | 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
jhwist
fuente
1
¿Llamo a esto antes de la \ dt, o en combinación? por favor incluya sintaxis gracias.
pstanton
118
Escribir \onuevamente lo apaga.
Carl G
3
Lamentablemente, la salida de \?no va al archivo. :(
blitzen9872
por su amable permiso habitual denegado dice que intente ejecutar psql como administrador
Ajay Takur
1
Sí, \o queries-output.txtredirige todos los comandos subsiguientes o / p al archivo nombrado queries-output.txty al escribir \o(en el indicador psql nuevamente) revierte este comportamiento de redirección.
hygull
95

El \ocomando psql ya fue descrito por jhwist.

Un enfoque alternativo es usar el COPY TOcomando para escribir directamente en un archivo en el servidor. Esto tiene la ventaja de que está volcado 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.

¡NÓTESE BIEN! 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 el separador de campo.

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

intgr
fuente
Estoy de acuerdo @helvete, el enfoque presentado aquí proporciona más poder para que el usuario configure la salida de una manera más personalizada
Nathan Benton
27

\copyque 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 Sintaxis de copia SQL de Postgres

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

Lo anterior guardará el resultado de la consulta de selección en el nombre de archivo proporcionado como un archivo csv

EDITAR:

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

copy (select * from table1) to 'full_path_filename' csv header;
Aakash Gupta
fuente
Muy útil, gracias. Pero la 'copia' en '... copiar a ...' no es necesaria; de hecho, en las versiones recientes hace que el comando falle.
Tom
Tom, creo que fue un error tipográfico. Edité la publicación con la que funciona en mi instalación pgsql 8.5ver
Aakash Gupta
Solo una nota rápida para cualquiera que intente pegar una declaración de varias líneas después de \ copy y obtenga errores de sintaxis confusos, como acabo de hacer. Debe continuar en la misma línea que \ copy.
pidió
¿Hay alguna forma de desactivar \ copy? Descubrí que si ejecuto una declaración como en su ejemplo, y luego ejecuto, por ejemplo, seleccionar * de los usuarios; que agregará los resultados al archivo más reciente que especifiqué en lugar de enviarlos a la pantalla. Gracias.
raphael75
6

Use el parámetro o del comando pgsql.

-o, --output = FILENAME envía los resultados de la consulta al archivo (o | pipe)

psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt
Yavuz
fuente
3

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

Stephen
fuente
En postgres, COPY se reemplaza mejor por \ COPY para evitar la necesidad de db admin. En Windows, esto coloca el archivo en C: \ tmp
Jan
3

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

Daniil Mashkin
fuente
2

Utilice la consulta a continuación para almacenar el resultado en el archivo csv

\ copy (su consulta) al encabezado csv de 'ruta de archivo';

Ejemplo

\ copy (seleccione nombre, orden de fecha de orden de compra) al encabezado cvs '/home/ankit/Desktop/result.csv';

Espero que esto te ayude.

Er.Ankit H Gandhi
fuente
1

Supongo que existe algún comando interno de psql para esto, pero también puede ejecutar el scriptcomando desde el paquete util-linux-ng :

DESCRIPCIÓN Script crea un mecanografiado de todo lo impreso en su terminal.

hlovdal
fuente
0

Este enfoque funcionará con cualquier comando psql desde el más simple hasta el más complejo sin requerir ningún cambio o ajuste al comando original.

NOTA: para servidores Linux.


  • Guarde el contenido de su comando en un archivo

MODELO

read -r -d '' FILE_CONTENT << 'HEREDOC'
[COMMAND_CONTENT]

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd

EJEMPLO

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
  • Ejecuta el comando

MODELO

sudo -u postgres psql [some_db] -c "$(cat sqlcmd)" >>sqlop 2>&1

EJEMPLO

sudo -u postgres psql some_db -c "$(cat sqlcmd)" >>sqlop 2>&1

  • Ver / rastrear la salida de su comando

cat sqlop

¡Hecho! ¡Gracias! = D

Eduardo Lucio
fuente
0

Enfoque para el acoplador

a través del comando psql

 docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt

o consulta del archivo sql

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
Roman Rhrn Nesterov
fuente