43

是否可以在 .sql 文件中使用 Linux 环境变量?我正在使用复制/选择查询来写入输出文件,并且我想将该目录放在一个变量中。所以我想做类似的事情:

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

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

4

3 回答 3

66

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

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

另一个(我认为更好)的解决方案是仅使用psql变量,请参阅我的这个关于 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
于 2013-09-10T23:40:50.033 回答
1

如果您像我提到的那样单引号输出文件名,这似乎适用于您的用例。它将转义 SQL 中包含的任何双引号。

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

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

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

于 2013-09-10T20:35:01.553 回答
1

接受的答案对于在 Unix 上运行的 PostgreSQL 是正确的。在 Windows 下,需要不同的咒语来从 CMD shell 获取环境变量的值并避免 echo 命令返回的回车。

\set afile `set /p=%outputdir%/a.csv`
COPY (SELECT * FROM a) TO :'afile';
于 2020-07-26T07:28:18.470 回答