在PSQL脚本中使用环境变量

时间:2013-09-10 17:59:53

标签: sql postgresql environment-variables

是否可以在.sql文件中使用Linux环境变量?我正在使用copy / select查询写入输出文件,我想将该目录放在变量中。所以我想做一些事情:

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

Outputdir将在我的环境中设置。这可能吗?

3 个答案:

答案 0 :(得分:35)

您可以将shell命令的结果存储在psql变量中,如下所示:

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

另一个(我认为更好)解决方案是仅使用psql变量,请参阅this answer of mine about psql variables,这与您的示例类似。您的案例的一个例子是:

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

请注意,在示例中,您需要在脚本文件中设置变量,但如果在调用psql时设置该变量,则可以跳过第一行:

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

答案 1 :(得分:1)

接受的答案对于在Unix上运行的PostgreSQL是正确的。在Windows下,为了从CMD Shell中获取环境变量的值并避免echo命令返回的回车,需要使用另一种方法。

\set afile `set /p=%outputdir%/a.csv`
COPY (SELECT * FROM a) TO :'afile';

答案 2 :(得分:0)

这似乎适用于您的用例,前提是您按照我提到的单引号输出文件名。它将转义SQL中包含的任何双引号。

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

当然,请注意,如果您的文件包含任何美元引用变量,那么shell将尝试将其解释为变量,并且您的脚本将会中断,因此您将需要转义所需的任何美元符号。反斜杠。

另请参阅this question的已接受答案中的第二个片段,以获得更可靠的答案。