Postgres/PSQL – exportar automáticamente una consulta a CSV utilizando un archivo por lotes.
Cuando hago comandos manuales que funcionan de maravilla
psql "postgresql://server:myport/base?user=me&password=password"
\COPY (SELECT * FROM MyTable WHERE dt_dern_modif > '2021-12-21') TO 'C:\Users\Me\notifs_dump_cron.csv' DELIMITER ';' CSV HEADER;
Intento crear un archivo por lotes para guardar diariamente el contenido de una tabla en postgres en un archivo CSV y enviarlo posteriormente a través de FTP a un servidor.
Estoy usando Windows 10 y psql 11.13
¿Cómo puedo hacer esta exportación?
Por ahora, estoy intentando hacer algo como esto pero no funciona:
file.bat
psql "postgresql://server:myport/base?user=me&password=password" -c "\COPY (SELECT * FROM MyTable ') TO 'C:\Users\Me\notifs_dump_cron.csv' DELIMITER ';' CSV HEADER;"
Y cuando lo ejecuto, obtengo la siguiente respuesta:
psql "postgresql://server:myport/base?user=me&password=password" -c "\COPY (SELECT * FROM bng_safcom_cen.cofi;) TO 'C:\Users\SG41RPichet\Documents\notifs_dump_cron.csv' DELIMITER ';' CSV HEADER;"
psql : atención : opción adicional \COPY (SELECT * FROM bng_safcom_cen.cofi;) TO 'C:\Users\SG41RPichet\Documents\notifs_dump_cron.csv' DELIMITER ';' CSV HEADER; ignorada
psql (11.13, servidor 10.5 (Debian 10.5-1.pgdg80+1))
Atención: la codificación de consola (850) difiere de la codificación de Windows (1252).
Los caracteres de 8 bits pueden no funcionar correctamente.
Consulte la sección «Notas para usuarios de Windows» en la página
de referencia de psql para obtener más detalles.
Conexión SSL (protocolo: TLSv1.2, cifrado: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compresión: desactivado)
Ingrese «help» para obtener ayuda.
table=>
davy.ai
Para crear un archivo por lotes que exporte el contenido de una tabla en postgres a un archivo CSV y lo envíe mediante FTP a un servidor, puedes utilizar los siguientes comandos:
Primero, crea un archivo .bat (llamémoslo “exportar_datos.bat”) y ábrelo con un editor de texto.
En el archivo, agrega los siguientes comandos:
Explicación de los comandos:
@echo off
: Este comando desactiva la visualización de comandos en la consola.set date=...
: Este comando establece la fecha en formato AAAAMMDD para usarla como parte del nombre de archivo.set filename=...
: Este comando establece el nombre de archivo del archivo CSV exportado.set pg_conn=...
: Este comando establece la cadena de conexión a la base de datos PostgreSQL.set query=...
: Este comando establece la consulta SQL para obtener datos de la tabla.psql ...
: Este comando ejecuta la utilidad psql con los siguientes parámetros:%pg_conn%
: Utiliza la cadena de conexión definida anteriormente.-c "\COPY (%query%) TO 'C:\Users\Yo\%filename%' DELIMITER ';' CSV HEADER"
: Ejecuta el comando “COPY” para exportar los datos de la tabla a un archivo CSV con el nombre de archivo y el delimitador definidos anteriormente.ftp ...
: Este comando transfiere el archivo mediante FTP al servidor especificado en “ftp_comandos.txt”.A continuación, crea un archivo de texto (llamémoslo “ftp_comandos.txt”) y agrega los siguientes comandos:
Explicación de los comandos:
open ftp.servidor.com
: Este comando abre la conexión al servidor FTP.nombre_de_usuario
: Este comando especifica el nombre de usuario a utilizar para el inicio de sesión FTP.contraseña
: Este comando especifica la contraseña a utilizar para el inicio de sesión FTP.cd carpeta/destino/archivo
: Este comando cambia el directorio actual en el servidor FTP a la carpeta donde se guardará el archivo.binary
: Este comando establece el tipo de archivo en binario para el modo de transferencia correcto.put notifs_dump_*.csv
: Este comando carga el archivo con el nombre “notifs_dump_” y la fecha actual con “AAAAMMDD” agregada, seguida de “.csv”.bye
: Este comando cierra la sesión FTP y finaliza.Ahora guarda ambos archivos en la misma carpeta y ejecuta el archivo “exportar_datos.bat”. Esto exportará el contenido de la tabla “MiTabla” a un archivo CSV con la fecha actual agregada al nombre del archivo, y luego transferirá el archivo mediante FTP a la carpeta especificada en el servidor.
Nota: Asegúrate de reemplazar los marcadores de posición en los comandos con los valores reales específicos de tu entorno.