¿Cuál es la forma más fácil de guardar la salida PL / pgSQL de una base de datos PostgreSQL en un archivo CSV?
Estoy usando PostgreSQL 8.4 con pgAdmin III y el complemento PSQL desde donde ejecuto las consultas.
¿Cuál es la forma más fácil de guardar la salida PL / pgSQL de una base de datos PostgreSQL en un archivo CSV?
Estoy usando PostgreSQL 8.4 con pgAdmin III y el complemento PSQL desde donde ejecuto las consultas.
Respuestas:
¿Desea el archivo resultante en el servidor o en el cliente?
Lado del servidor
Si desea algo fácil de reutilizar o automatizar, puede usar el comando COPY integrado de Postgresql . p.ej
Este enfoque se ejecuta completamente en el servidor remoto : no puede escribir en su PC local. También debe ejecutarse como un "superusuario" de Postgres (normalmente llamado "root") porque Postgres no puede evitar que haga cosas desagradables con el sistema de archivos local de esa máquina.
En realidad, eso no significa que tenga que estar conectado como superusuario (la automatización sería un riesgo de seguridad de otro tipo), porque puede usar la
SECURITY DEFINER
opciónCREATE FUNCTION
para hacer una función que se ejecute como si fuera un superusuario .La parte crucial es que su función está allí para realizar comprobaciones adicionales, no solo para evitar la seguridad, por lo que podría escribir una función que exporte los datos exactos que necesita, o podría escribir algo que pueda aceptar varias opciones siempre que cumplir con una estricta lista blanca. Debe verificar dos cosas:
GRANT
s en la base de datos, pero la función ahora se ejecuta como un superusuario, por lo que las tablas que normalmente estarían "fuera de límites" serán completamente accesibles. Probablemente no desee permitir que alguien invoque su función y agregue filas al final de su tabla de "usuarios" ...He escrito una publicación de blog que amplía este enfoque , incluidos algunos ejemplos de funciones que exportan (o importan) archivos y tablas que cumplen condiciones estrictas.
Lado del cliente
El otro enfoque es manejar los archivos en el lado del cliente , es decir, en su aplicación o script. El servidor de Postgres no necesita saber en qué archivo está copiando, solo escupe los datos y el cliente los coloca en algún lugar.
La sintaxis subyacente para esto es el
COPY TO STDOUT
comando, y las herramientas gráficas como pgAdmin lo envolverán en un bonito diálogo.El
psql
cliente de línea de comandos tiene un "metacomando" especial llamado\copy
, que toma las mismas opciones que el "real"COPY
, pero se ejecuta dentro del cliente:Tenga en cuenta que no hay terminación
;
, porque los metacomandos terminan con nueva línea, a diferencia de los comandos SQL.De los documentos :
El lenguaje de programación de su aplicación también puede ser compatible con la inserción o recuperación de datos, pero generalmente no puede usar
COPY FROM STDIN
/TO STDOUT
dentro de una instrucción SQL estándar, porque no hay forma de conectar la secuencia de entrada / salida. El controlador PostgreSQL de PHP ( no PDO) incluye funciones muy básicaspg_copy_from
ypg_copy_to
que copian a / desde una matriz PHP, lo que puede no ser eficiente para grandes conjuntos de datos.fuente
\copy
funciona: allí, las rutas son relativas al cliente y no se necesita / permite ningún punto y coma. Mira mi edición.\copy
debe ser de una sola línea. Por lo tanto, no tiene la belleza de formatear el sql de la manera que desea, y simplemente poner una copia / función alrededor.\copy
es un metacomando especial en elpsql
cliente de línea de comandos . No funcionará en otros clientes, como pgAdmin; probablemente tendrán sus propias herramientas, como asistentes gráficos, para hacer este trabajo.Hay varias soluciones:
1
psql
comandopsql -d dbname -t -A -F"," -c "select * from users" > output.csv
Esto tiene la gran ventaja de que puede usarlo a través de SSH, como
ssh postgres@host command
: le permite obtener2
copy
comandos postgresCOPY (SELECT * from users) To '/tmp/output.csv' With CSV;
3 psql interactivos (o no)
Todos pueden usarse en scripts, pero prefiero el n. ° 1.
4 pgadmin pero eso no es programable.
fuente
En la terminal (mientras está conectado a la base de datos) configure la salida al archivo cvs
1) Configure el separador de campo en
','
:2) Establecer el formato de salida sin alinear:
3) Mostrar solo tuplas:
4) Establecer salida:
5) Ejecute su consulta:
6) Salida:
Luego podrá encontrar su archivo csv en esta ubicación:
Cópielo con el
scp
comando o edite con nano:fuente
COPY
o\copy
se manejan correctamente (convertir a formato CSV estándar); ¿Haz esto?Si está interesado en todas las columnas de una tabla en particular junto con los encabezados, puede usar
Esto es un poquito más simple que
que, que yo sepa, son equivalentes.
fuente
CSV Unificación de Exportación
Esta información no está realmente bien representada. Como esta es la segunda vez que necesito derivar esto, lo pondré aquí para recordarme si nada más.
Realmente la mejor manera de hacer esto (sacar CSV de postgres) es usar el
COPY ... TO STDOUT
comando. Aunque no desea hacerlo de la manera que se muestra en las respuestas aquí. La forma correcta de usar el comando es:¡Recuerda solo un comando!
Es genial para usar sobre ssh:
Es genial para usar dentro de Docker sobre ssh:
Incluso es genial en la máquina local:
¿O dentro de la ventana acoplable en la máquina local ?:
¿O en un clúster de kubernetes, en Docker, a través de HTTPS?
¡Tan versátil, muchas comas!
¿Por lo menos?
Sí lo hice, aquí están mis notas:
Las COPIAS
Usar
/copy
efectivamente ejecuta operaciones de archivo en cualquier sistema en el que sepsql
esté ejecutando el comando, como el usuario que lo está ejecutando 1 . Si se conecta a un servidor remoto, es simple copiar archivos de datos en el sistema que se ejecutapsql
desde / hacia el servidor remoto.COPY
ejecuta operaciones de archivo en el servidor como la cuenta de usuario del proceso de fondo (predeterminadopostgres
), las rutas de los archivos y los permisos se verifican y aplican en consecuencia. Si se usa,TO STDOUT
se omiten las verificaciones de permisos de archivos.Ambas opciones requieren un movimiento de archivo posterior si
psql
no se está ejecutando en el sistema donde desea que resida el CSV resultante. Este es el caso más probable, en mi experiencia, cuando trabajas principalmente con servidores remotos.Es más complejo configurar algo como un túnel TCP / IP a través de ssh en un sistema remoto para una salida CSV simple, pero para otros formatos de salida (binario) puede ser mejor
/copy
sobre una conexión tunelizada, ejecutando un localpsql
. De manera similar, para grandes importaciones, mover el archivo fuente al servidor y usarloCOPY
es probablemente la opción de mayor rendimiento.Parámetros de PSQL
Con los parámetros psql puede formatear la salida como CSV pero hay inconvenientes como tener que recordar deshabilitar el localizador y no obtener encabezados:
Otras herramientas
No, solo quiero sacar CSV de mi servidor sin compilar y / o instalar una herramienta.
fuente
Tuve que usar \ COPY porque recibí el mensaje de error:
Entonces usé:
y esta funcionando
fuente
psql
puede hacer esto por usted:Consulte
man psql
para obtener ayuda sobre las opciones utilizadas aquí.fuente
La nueva versión, psql 12, será compatible
--csv
.Uso:
fuente
Estoy trabajando en AWS Redshift, que no es compatible con la
COPY TO
función.Sin embargo, mi herramienta de BI admite CSV delimitados por tabulaciones, por lo que utilicé lo siguiente:
fuente
En pgAdmin III hay una opción para exportar a un archivo desde la ventana de consulta. En el menú principal es Consulta -> Ejecutar para archivar o hay un botón que hace lo mismo (es un triángulo verde con un disquete azul en lugar del triángulo verde que simplemente ejecuta la consulta). Si no está ejecutando la consulta desde la ventana de consulta, entonces haría lo que IMSoP sugirió y usaría el comando copiar.
fuente
Intenté varias cosas, pero pocas pudieron darme el CSV deseado con los detalles del encabezado.
Esto es lo que funcionó para mí.
fuente
He escrito una pequeña herramienta llamada
psql2csv
que encapsula elCOPY query TO STDOUT
patrón, lo que resulta en un CSV adecuado. Su interfaz es similar apsql
.Se supone que la consulta es el contenido de STDIN, si está presente, o el último argumento. Todos los demás argumentos se envían a psql excepto estos:
fuente
Si tiene una consulta más larga y le gusta usar psql, coloque su consulta en un archivo y use el siguiente comando:
fuente
-F","
lugar de-F";"
generar un archivo CSV que se abriría correctamente en MS ExcelPara descargar el archivo CSV con nombres de columna como HEADER, use este comando:
fuente
Recomiendo encarecidamente DataGrip , una base de datos IDE de JetBrains. Puede exportar una consulta SQL a un archivo CSV y puede configurar túneles ssh con facilidad. Cuando la documentación se refiere al "conjunto de resultados", significan el resultado devuelto por una consulta SQL en la consola.
No estoy asociado con DataGrip, ¡me encanta el producto!
fuente
JackDB , un cliente de base de datos en su navegador web, lo hace realmente fácil. Especialmente si estás en Heroku.
Le permite conectarse a bases de datos remotas y ejecutar consultas SQL en ellas.
Fuente (fuente: jackdb.com )
Una vez que su base de datos está conectada, puede ejecutar una consulta y exportar a CSV o TXT (ver abajo a la derecha).
Nota: de ninguna manera estoy afiliado a JackDB. Actualmente uso sus servicios gratuitos y creo que es un gran producto.
fuente
Por solicitud de @ skeller88, estoy volviendo a publicar mi comentario como respuesta para que las personas que no leen cada respuesta no lo pierdan ...
El problema con DataGrip es que controla tu billetera. No es gratis Pruebe la edición comunitaria de DBeaver en dbeaver.io. Es una herramienta de base de datos multiplataforma FOSS para programadores SQL, DBA y analistas que admite todas las bases de datos populares: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto, etc.
DBeaver Community Edition hace que sea trivial conectarse a una base de datos, realizar consultas para recuperar datos y luego descargar el conjunto de resultados para guardarlo en CSV, JSON, SQL u otros formatos de datos comunes. Es un competidor viable de FOSS para TOAD para Postgres, TOAD para SQL Server o Toad para Oracle.
No tengo afiliación con DBeaver. Me encanta el precio y la funcionalidad, pero desearía que abrieran más la aplicación DBeaver / Eclipse y facilitaran la adición de widgets de análisis a DBeaver / Eclipse, en lugar de exigir a los usuarios que paguen la suscripción anual para crear gráficos y tablas directamente en la aplicación. Mis habilidades de codificación Java están oxidadas y no tengo ganas de tomarme semanas para volver a aprender cómo construir widgets de Eclipse, solo para descubrir que DBeaver ha deshabilitado la capacidad de agregar widgets de terceros a DBeaver Community Edition.
¿Los usuarios de DBeaver tienen una idea de los pasos para crear widgets de análisis para agregar a la edición comunitaria de DBeaver?
fuente
fuente