Løsningen i det accepterede svar vil kun virke på serveren, og når brugeren, der udfører forespørgslen, vil have tilladelse til at læse filen som forklaret i dette SO-svar.
Ellers er en mere fleksibel tilgang at erstatte SQL's COPY
kommandoen med psql
's "meta-kommando" kaldet \copy
som tager alle de samme muligheder som den "rigtige" COPY, men køres inde i klienten (uden behov for ;
til sidst):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
I henhold til dokumenter er \copy
kommando:
Udfører en frontend (klient) kopi. Dette er en operation, der kører en SQL COPY-kommando, men i stedet for at serveren læser eller skriver den angivne fil, læser eller skriver psql filen og dirigerer data mellem serveren og det lokale filsystem. Det betyder, at filtilgængelighed og -privilegier er dem, der tilhører den lokale bruger, ikke serveren, og der kræves ingen SQL-superbrugerprivilegier.
Desuden, hvis the_file.csv
indeholder overskriften i den første linje, den kan genkendes ved at tilføje header
i slutningen af ovenstående kommando:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"