是否可以在.sql文件中使用Linux环境变量?我正在使用copy / select查询写入输出文件,我想将该目录放在变量中。所以我想做一些事情:
COPY (SELECT * FROM a)
TO $outputdir/a.csv
Outputdir将在我的环境中设置。这可能吗?
答案 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的已接受答案中的第二个片段,以获得更可靠的答案。