【问题标题】:Using an environment variable in a PSQL script在 PSQL 脚本中使用环境变量
【发布时间】:2013-09-14 13:46:36
【问题描述】:

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

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

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

【问题讨论】:

标签: sql postgresql environment-variables


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您可以将 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
    

    【讨论】:

    • 我对这个答案感到非常兴奋,但它对我来说并不是很有效。使用你的第一个例子,'afile' 只是评估为'echo "$outputdir/a.csv"'。引号内的任何内容都没有展开。
    • 这些示例适用于 psql 9.2.4。你用的是什么版本的 psql?
    • 根据 9.0 的psql docs,您应该能够使用反引号从外壳返回输出。因此,这不应该是特别输出回声部分,并且变量也应该受到扩展。您是否逐字复制该代码并手动输入,确定您没有使用单引号而不是反引号?
    • 是的!单引号正是我使用的。非常感谢你的洞察力!!
    • echo $outputdir 用于访问环境变量的语法在 Unix 上完美运行。在 Windows 上需要不同的咒语;请参阅下面的答案。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2020-04-05
      • 2017-10-26
      • 1970-01-01
      相关资源
      最近更新 更多