La soluzione nella risposta accettata funzionerà solo sul server e quando l'utente che esegue la query avrà i permessi per leggere il file come spiegato in questa risposta SO.
In caso contrario, un approccio più flessibile consiste nel sostituire COPY
di SQL comando con il psql
il "meta-comando" chiamato \copy
che accetta tutte le stesse opzioni della COPIA "reale", ma viene eseguito all'interno del client (senza bisogno di ;
alla fine):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
Come da documenti, il \copy
comando:
Esegue una copia front-end (client). Questa è un'operazione che esegue un comando SQL COPY, ma invece di leggere o scrivere il file specificato, psql legge o scrive il file e instrada i dati tra il server e il file system locale. Ciò significa che l'accessibilità e i privilegi dei file sono quelli dell'utente locale, non del server, e non sono richiesti privilegi di superutente SQL.
Inoltre, se il the_file.csv
contiene l'intestazione nella prima riga, può essere riconosciuta aggiungendo header
alla fine del comando precedente:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"