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;"