Решението в приетия отговор ще работи само на сървъра и когато потребителят, изпълняващ заявката, ще има разрешения да прочете файла, както е обяснено в този SO отговор.
В противен случай по-гъвкав подход е да се замени COPY
на SQL команда с psql
"мета-команда" на "\copy
който приема всички същите опции като "истинското" COPY, но се изпълнява вътре в клиента (без нужда от ;
в края):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
Според документи, \copy
команда:
Извършва фронтенд (клиентско) копие. Това е операция, която изпълнява командата SQL COPY, но вместо сървърът да чете или записва посочения файл, psql чете или записва файла и маршрутизира данните между сървъра и локалната файлова система. Това означава, че достъпността и привилегиите на файлове са тези на локалния потребител, а не на сървъра, и не се изискват привилегии на суперпотребител на SQL.
Освен това, ако the_file.csv
съдържа заглавката в първия ред, може да бъде разпозната чрез добавяне на header
в края на горната команда:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"