Lösningen i det accepterade svaret kommer bara att fungera på servern och när användaren som kör frågan har behörighet att läsa filen som förklaras i detta SO-svar.
Annars är ett mer flexibelt tillvägagångssätt att ersätta SQL:s COPY
kommandot med psql
s "meta-kommando" som heter \copy
som tar alla samma alternativ som den "riktiga" COPY, men körs inuti klienten (utan behov av ;
i slutet):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
Enligt dokument, \copy
kommando:
Utför en frontend (klient) kopia. Detta är en operation som kör ett SQL COPY-kommando, men istället för att servern läser eller skriver den angivna filen, läser eller skriver psql filen och dirigerar data mellan servern och det lokala filsystemet. Detta betyder att filtillgänglighet och privilegier är de för den lokala användaren, inte servern, och inga SQL-superanvändarbehörigheter krävs.
Dessutom, om the_file.csv
innehåller rubriken på den första raden, den kan kännas igen genom att lägga till header
i slutet av ovanstående kommando:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"