Exporte la tabla remota de Postgres a un archivo CSV en la máquina local


15

Tengo acceso de solo lectura a una base de datos en un servidor remoto. Entonces, puedo ejecutar:

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

Pero en ese servidor no tengo permisos para crear / guardar un archivo, así que necesito hacer esto en mi máquina local.

Cuando me conecto a la base de datos remota, ¿cómo puedo ejecutar un comando para guardar el archivo en mi máquina local en lugar del servidor remoto?

O, ¿cómo puedo ejecutar un comando de Linux para conectarme a la base de datos remota, ejecutar una consulta y guardar la salida como un archivo en mi máquina local?

Respuestas:


29

Ambos enfoques ya sugeridos parecen ser innecesariamente complicados.

Simplemente use psqlel \copycomando incorporado , que funciona igual que el lado del servidor, COPYpero hace una copia a través del protocolo de conexión al cliente y utiliza las rutas del cliente.

Debido a que es un psqlcomando de barra diagonal inversa, omite el punto y coma final, por ejemplo:

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

Vea la \copyentrada en el manual para el psqlcomando y la COPYdocumentación del comando para más detalles.

Al igual COPYque puede usar \copycon una (SELECT ...)consulta en lugar de un nombre de tabla al copiar datos (pero no en).


Una alternativa generalmente inferior que puede ser útil en algunas situaciones limitadas es usar:

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

y use la -obandera o la redirección de salida de shell para escribir la salida en un archivo. Casi siempre debes usarlo \copycon preferencia a esto.


Pero esto no permite transacciones :(
Reza S

Um, claro que sí. Use un documento aquí para alimentar psqlun script, comenzando con BEGIN, luego haciendo sus \copycomandos, luego a COMMIT. O use psql -fpara ejecutar un script en lugar de usar un documento aquí.
Craig Ringer

Gracias por volver ... eso es lo que terminé haciendo y funcionó =)
Reza S

Puede usar en -Alugar de -P format=unalignedy también creo que necesita un-P fieldsep=,
Evan Carroll

2

El comando de Linux es:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'

1
Eso no producirá CSV, producirá salida de texto formateado. Si agrega -t -P format=unaligned a ese comando, obtendrá algo un poco más cerca, como CSV delimitado por tuberías con errores, pero las tuberías en el texto no se escaparán, por lo que no será válido.
Craig Ringer

Ah, también querría, -P fieldsep=','excepto que esto sería aún más probable que cause errores debido a la falta de escape. -P fieldsep_zero=onestaría bien si no le importara analizar texto delimitado por bytes nulos, ya que los bytes nulos no pueden ocurrir en la psqlsalida de forma natural.
Craig Ringer
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.