La solución en la respuesta aceptada solo funcionará en el servidor y cuando el usuario ejecute 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 COPY
de SQL comando con psql
El "meta-comando" llamado \copy
que toma todas las mismas opciones que la COPIA "real", pero se ejecuta dentro del cliente (sin necesidad de ;
al final):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
Según los documentos, \copy
comando:
Realiza una copia de frontend (cliente). Esta es una operación que ejecuta un comando SQL COPY, 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 los del servidor, y no se requieren privilegios de superusuario de SQL.
Además, si el the_file.csv
contiene el encabezado en la primera línea, se puede reconocer agregando header
al final del comando anterior:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"