【问题标题】:How can I quote a named argument passed in to psql?如何引用传递给 psql 的命名参数?
【发布时间】:2012-08-11 23:32:07
【问题描述】:

psql 有一个用于传递命名参数的构造:

psql -v name='value'

然后可以在脚本中引用:

SELECT :name;

这将给出结果

 ?column?
----------
 value
(1 row)

在开发过程中,我需要相当频繁地删除和重新创建数据库的副本,因此我正在尝试自动化该过程。所以我需要运行一个查询,强制断开所有用户,然后删除数据库。但是这个操作的数据库会有所不同,所以数据库名称需要是一个参数。

问题在于断开用户连接的查询需要一个字符串 (WHERE pg_stat_activity.datname = 'dbname'),而丢弃的查询需要一个不带引号的令牌 (DROP DATABASE IF EXISTS dbname)。 (抱歉。不知道如何称呼这种令牌。)

我可以在 DROP 查询中使用不带引号的命名参数,但在断开连接查询中引用命名参数会导致参数不被扩展。即,我会得到字符串 ':name' 而不是字符串 'value'

有什么方法可以将不带引号的值转换为字符串或将字符串转换为 DROP 查询的不带引号的标记?我可以通过将断开连接和 DROP 查询放在单独的脚本中并将带引号的参数传递给断开连接和不带引号的 DROP 来解决它,但我更希望它们在同一个脚本中,因为它们实际上是两个步骤在一个进程中。

【问题讨论】:

    标签: postgresql keyword identifier psql


    【解决方案1】:

    用途:

    ... WHERE pg_stat_activity.datname = <b>:'name'</b>

    注意冒号在单引号前的位置。
    The manual:

    如果出现不带引号的冒号 (:) 后跟 psql 变量名 在参数中,它被变量的值替换,如 在下面的SQL Interpolation 中描述。表格 :'variable_name':"variable_name" 描述了那里也可以工作。

    And:

    要将变量的值引用为 SQL 文字,请写一个冒号 后跟单引号中的变量名。

    【讨论】:

    • 谢谢! PostgreSQL 的手册很有帮助的。我只是找不到那个。要么我错过了它,要么我不想看那个页面(这对我来说很愚蠢)。
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2011-07-02
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多