Подтвердить что ты не робот

Использование переменной среды в PSQL script

Можно ли использовать переменную среды Linux внутри файла .sql? Я использую запрос copy/select для записи в выходной файл, и я хотел бы поместить этот каталог в переменную. Поэтому я хочу сделать что-то вроде:

COPY (SELECT * FROM a)
TO $outputdir/a.csv

Outputdir будет установлен в моей среде. Возможно ли это?

4b9b3361

Ответ 1

Вы можете сохранить результат команды оболочки внутри переменной psql следующим образом:

\set afile `echo "$outputdir/a.csv"`
COPY (SELECT * FROM a) TO :'afile';

Другое (лучше, на мой взгляд) решение - использовать только переменные psql, см. этот мой ответ о переменных psql, который похож на ваш пример. Пример для вашего случая:

\set outputdir '/path/to/output'
\set afile :outputdir '/a.csv'
COPY (SELECT * FROM a) TO :'afile';

Обратите внимание, что в этом примере вам нужно установить переменную внутри файла script, но вы можете пропустить первую строку, если вы установите ее, когда вы вызываете psql:

psql --set=outputdir="$outputdir" <conn parameters> -f /path/to/yourscript.sql

Ответ 2

Это, похоже, работает для вашего случая использования, при условии, что вы укажете имя выходного файла, как я уже упоминал. Он избежит любых двойных кавычек, также содержащихся в SQL.

psql -c "$(eval echo '"' $(<envvars.sql | sed 's/"/\\"/g') '"')"

Конечно, обратите внимание, что если ваш файл содержит любые котируемые доллары переменные, оболочка будет пытаться интерпретировать как переменную, а ваш script сломается, поэтому вам нужно будет избежать любых значков доллара, которые вам нужно сохранить буквально с обратной косой чертой.

См. также второй фрагмент в принятом ответе на этот вопрос для возможного более надежного ответа.