在PSQL脚本中使用环境变量

use*_*256 32 sql postgresql environment-variables

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

COPY (SELECT * FROM a)
TO $outputdir/a.csv
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*sOl 45

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

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

另一个(在我看来更好)解决方案是仅使用psql变量,请参阅我的关于psql变量的答案,这与您的示例类似.您案例的一个例子是:

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

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

psql --set=outputdir="$outputdir" <conn parameters> -f /path/to/yourscript.sql
Run Code Online (Sandbox Code Playgroud)

  • 根据9.0的[psql docs](http://www.postgresql.org/docs/9.0/static/app-psql.html),你_should_能够使用反引用来返回shell的输出.因此,尤其应该不输出回声部分,并且该变量也应该进行扩展.您是否逐字复制了该代码,并且是手动输入的,确定您没有使用单引号而不是反引号? (3认同)
  • 我对这个答案感到非常兴奋,但它并不适合我.使用你的第一个例子,'afile'只评估'echo'$ outputdir/a.csv"'.引号内的任何内容都没有扩展. (2认同)