Respuestas:
¿Desea el archivo resultante en el servidor o en el cliente?
Si desea algo fácil de reutilizar o automatizar, puede usar el comando COPY integrado de Postgresql . p.ej
Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;
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.
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:
\copy (Select * From foo) To '/tmp/test.csv' With CSV
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 :
No confunda COPY con la instrucción psql \ copy. \ copy invoca COPY FROM STDIN o COPY TO STDOUT, y luego recupera / almacena los datos en un archivo accesible para el cliente psql. Por lo tanto, la accesibilidad de los archivos y los derechos de acceso dependen del cliente en lugar del servidor cuando se usa \ copy.
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ásicas pg_copy_from
y pg_copy_to
que copian a / desde una matriz PHP, lo que puede no ser eficiente para grandes conjuntos de datos.
\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 el psql
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:
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 obtener
copy
comandos postgresCOPY (SELECT * from users) To '/tmp/output.csv' With CSV;
>psql dbname
psql>\f ','
psql>\a
psql>\o '/tmp/output.csv'
psql>SELECT * from users;
psql>\q
Todos pueden usarse en scripts, pero prefiero el n. ° 1.
En la terminal (mientras está conectado a la base de datos) configure la salida al archivo cvs
1) Configure el separador de campo en ','
:
\f ','
2) Establecer el formato de salida sin alinear:
\a
3) Mostrar solo tuplas:
\t
4) Establecer salida:
\o '/tmp/yourOutputFile.csv'
5) Ejecute su consulta:
:select * from YOUR_TABLE
6) Salida:
\o
Luego podrá encontrar su archivo csv en esta ubicación:
cd /tmp
Cópielo con el scp
comando o edite con nano:
nano /tmp/yourOutputFile.csv
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
COPY table TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
Esto es un poquito más simple que
COPY (SELECT * FROM table) TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
que, que yo sepa, son equivalentes.
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:
COPY (select id, name from groups) TO STDOUT WITH CSV HEADER
Es genial para usar sobre ssh:
$ ssh psqlserver.example.com 'psql -d mydb "COPY (select id, name from groups) TO STDOUT WITH CSV HEADER"' > groups.csv
Es genial para usar dentro de Docker sobre ssh:
$ ssh pgserver.example.com 'docker exec -tu postgres postgres psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
Incluso es genial en la máquina local:
$ psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
¿O dentro de la ventana acoplable en la máquina local ?:
docker exec -tu postgres postgres psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
¿O en un clúster de kubernetes, en Docker, a través de HTTPS?
kubectl exec -t postgres-2592991581-ws2td 'psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
¡Tan versátil, muchas comas!
Sí lo hice, aquí están mis notas:
Usar /copy
efectivamente ejecuta operaciones de archivo en cualquier sistema en el que se psql
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 ejecuta psql
desde / hacia el servidor remoto.
COPY
ejecuta operaciones de archivo en el servidor como la cuenta de usuario del proceso de fondo (predeterminado postgres
), 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 local psql
. De manera similar, para grandes importaciones, mover el archivo fuente al servidor y usarlo COPY
es probablemente la opción de mayor rendimiento.
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:
$ psql -P pager=off -d mydb -t -A -F',' -c 'select * from groups;'
2,Technician,Test 2,,,t,,0,,
3,Truck,1,2017-10-02,,t,,0,,
4,Truck,2,2017-10-02,,t,,0,,
No, solo quiero sacar CSV de mi servidor sin compilar y / o instalar una herramienta.
psql
puede hacer esto por usted:
edd@ron:~$ psql -d beancounter -t -A -F"," \
-c "select date, symbol, day_close " \
"from stockprices where symbol like 'I%' " \
"and date >= '2009-10-02'"
2009-10-02,IBM,119.02
2009-10-02,IEF,92.77
2009-10-02,IEV,37.05
2009-10-02,IJH,66.18
2009-10-02,IJR,50.33
2009-10-02,ILF,42.24
2009-10-02,INTC,18.97
2009-10-02,IP,21.39
edd@ron:~$
Consulte man psql
para obtener ayuda sobre las opciones utilizadas aquí.
La nueva versión, psql 12, será compatible --csv
.
--csv
Cambia al modo de salida CSV (valores separados por comas). Esto es equivalente a \ pset format csv .
csv_fieldsep
Especifica el separador de campo que se utilizará en formato de salida CSV. Si el carácter separador aparece en el valor de un campo, ese campo se genera entre comillas dobles, siguiendo las reglas CSV estándar. El valor predeterminado es una coma.
Uso:
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv -P csv_fieldsep='^' postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres > output.csv
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:
psql -h dblocation -p port -U user -d dbname -F $'\t' --no-align -c "SELECT * FROM TABLE" > outfile.csv
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.
He escrito una pequeña herramienta llamada psql2csv
que encapsula el COPY query TO STDOUT
patrón, lo que resulta en un CSV adecuado. Su interfaz es similar a psql
.
psql2csv [OPTIONS] < QUERY
psql2csv [OPTIONS] QUERY
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:
-h, --help show help, then exit
--encoding=ENCODING use a different encoding than UTF8 (Excel likes LATIN1)
--no-header do not output a header
Si tiene una consulta más larga y le gusta usar psql, coloque su consulta en un archivo y use el siguiente comando:
psql -d my_db_name -t -A -F";" -f input-file.sql -o output-file.csv
-F","
lugar de -F";"
generar un archivo CSV que se abriría correctamente en MS Excel
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!
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.
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?
import json
cursor = conn.cursor()
qry = """ SELECT details FROM test_csvfile """
cursor.execute(qry)
rows = cursor.fetchall()
value = json.dumps(rows)
with open("/home/asha/Desktop/Income_output.json","w+") as f:
f.write(value)
print 'Saved to File Successfully'