es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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=>
Tags:  , , ,

Answer

  1. Avatar for 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:

    @echo off
    set date=%date:~10,4%%date:~7,2%%date:~4,2%
    set filename=notifs_dump_%date%.csv
    set pg_conn=postgresql://servidor:mi_puerto/base?user=yo&password=contraseña
    set query=SELECT * FROM MiTabla
    
    psql %pg_conn% -c "\COPY (%query%) TO 'C:\Users\Yo\%filename%' DELIMITER ';' CSV HEADER"
    
    ftp -s:ftp_comandos.txt ftp.servidor.com
    

    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:

    open ftp.servidor.com
    nombre_de_usuario
    contraseña
    cd carpeta/destino/archivo
    binary
    put notifs_dump_*.csv
    bye
    

    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.

Comments are closed.