from examples ejemplo create linux database postgresql shell import

linux - examples - PostgreSQL CSV importar desde línea de comandos



copy postgresql examples (4)

Como se indica en la Documentación PostgreSQL ( II. Aplicaciones cliente PostgreSQL - psql ), puede pasar un comando a psql con el interruptor -c :

psql -c "COPY tbname FROM ''/tmp/the_file.csv'' delimiter ''|'' csv;"

He estado usando el terminal psql Postgres para importar archivos CSV en tablas usando lo siguiente

COPY tbname FROM ''/tmp/the_file.csv'' delimiter ''|'' csv;

que funciona bien, excepto que tengo que iniciar sesión en el terminal psql para ejecutarlo.

Me gustaría saber si alguien conoce una forma de ejecutar un comando similar a este desde la línea de comandos de shell de Linux similar a cómo Postgres permite un comando de shell como el siguiente

/opt/postgresql/bin/pg_dump dbname > /tmp/dbname.sql

Esto permite el volcado de una base de datos desde el shell de Linux sin iniciar sesión en el terminal psql.


La forma más flexible es usar un HERE document shell HERE document , que le permite usar variables de shell dentro de su consulta, incluso entre comillas (dobles o simples):

#!/bin/sh THE_USER=moi THE_DB=stuff THE_TABLE=personnel PSQL=/opt/postgresql/bin/psql THE_DIR=/tmp THE_FILE=the_file.csv ${PSQL} -U ${THE_USER} ${THE_DB} <<OMG COPY ${THE_TABLE} FROM ''${THE_DIR}/${THE_FILE}'' delimiter ''|'' csv; OMG


La solución en la respuesta aceptada solo funcionará en el servidor y cuando el usuario que ejecuta la consulta tendrá permisos para leer el archivo como se explica en esta respuesta SO .

De lo contrario, un enfoque más flexible es reemplazar el comando COPY del SQL con el "meta-comando" de psql llamado /copy que toma todas las mismas opciones que el COPY "real", pero se ejecuta dentro del cliente (sin necesidad para ; al final):

psql -c "/copy tbname FROM ''/tmp/the_file.csv'' delimiter ''|'' csv"

Según los documentos , el comando /copy :

Realiza una copia frontend (cliente). Esta es una operación que ejecuta un comando de COPIA de SQL, pero en lugar de que el servidor lea o escriba el archivo especificado, psql lee o escribe el archivo y enruta los datos entre el servidor y el sistema de archivos local. Esto significa que la accesibilidad y los privilegios de los archivos son los del usuario local, no el servidor, y no se requieren privilegios de superusuario de SQL.

Además, si the_file.csv contiene el encabezado en la primera línea, se puede reconocer agregando un header al final del comando anterior:

psql -c "/copy tbname FROM ''/tmp/the_file.csv'' delimiter ''|'' csv header"


Para completar la answer anterior, sugeriría:

psql -d your_dbname --user=db_username -c "COPY tbname FROM ''/tmp/the_file.csv'' delimiter ''|'' csv;"