PostgresQL: передача частичного пути к файлу в качестве параметра командной строки - PullRequest
0 голосов
/ 09 апреля 2019

Я пишу сценарий для экспорта подмножества данных из экземпляра PostgreSQL, и у меня возникли некоторые проблемы, связанные с программным построением пути к выходному файлу.

Что бы я хотелбыть в состоянии сделать что-то вроде:

psql -d mydb -f my_script.sql -v out_path="'/path/to/my/output/dir/'"

Что я попытался с помощью следующего простого примера

COPY my_table TO :out_path || 'file.csv' WITH CSV;

Однако это приводит к следующей ошибке:

psql:my_script.sql:4: ERROR:  syntax error at or near "||"
LINE 1: ...path/to/my/output/dir/' || 'my_tabl...

Есть ли лучший способ собрать нужный путь вывода в сценарии?Я все об этом ошибаюсь?Любое руководство будет высоко ценится!

1 Ответ

1 голос
/ 09 апреля 2019

В этом случае вам не следует использовать оператор ||.Это оператор SQL, и COPY не допускает выражения там.

psql переменные объединяются по умолчанию.Так что в этом случае оператор || бесполезен.

\set out_path /path/to/my/output/dir/
\echo :out_path/file_csv

postgres=# \set out_path /path/to/my/output/dir/
postgres=# \echo :out_path/file_csv
/path/to/my/output/dir//file_csv

Если вы не запускаете этот скрипт под суперпользователем, вы не сможете записать в файловую систему сервера.Это не хорошо делать эти операции под суперпользователем.Поэтому, вероятно, вам следует использовать команды \COPY, которые связаны с файловой системой на стороне клиента.

Таким образом, ваш скрипт может выглядеть так:

-- does concat too
\set file_path :out_path 'file.csv' 
\copy my_table to :file_path csv
...