Использование переменной среды в PSQL script
Можно ли использовать переменную среды Linux внутри файла .sql? Я использую запрос copy/select для записи в выходной файл, и я хотел бы поместить этот каталог в переменную. Поэтому я хочу сделать что-то вроде:
COPY (SELECT * FROM a)
TO $outputdir/a.csv
Outputdir будет установлен в моей среде. Возможно ли это?
Ответы
Ответ 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 сломается, поэтому вам нужно будет избежать любых значков доллара, которые вам нужно сохранить буквально с обратной косой чертой.
См. также второй фрагмент в принятом ответе на этот вопрос для возможного более надежного ответа.