A solução na resposta aceita funcionará apenas no servidor e quando o usuário que estiver executando a consulta terá permissões para ler o arquivo conforme explicado nesta resposta SO.
Caso contrário, uma abordagem mais flexível é substituir o
COPY
do SQL comando com o psql
"meta-comando" chamado \copy
que tem as mesmas opções que o COPY "real", mas é executado dentro do cliente (sem necessidade de ;
no final):psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
De acordo com os documentos, o
\copy
comando:
Executa uma cópia de frontend (cliente). Esta é uma operação que executa um comando SQL COPY, mas em vez de o servidor ler ou gravar o arquivo especificado, o psql lê ou grava o arquivo e roteia os dados entre o servidor e o sistema de arquivos local. Isso significa que a acessibilidade e os privilégios do arquivo são aqueles do usuário local, não do servidor, e nenhum privilégio de superusuário SQL é necessário.
Além disso, se o
the_file.csv
contém o cabeçalho na primeira linha, ele pode ser reconhecido adicionando header
no final do comando acima:psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"