7

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

psql -v name='value'

然后可以在脚本中引用它:

SELECT :name;

这将给出结果

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

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

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

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

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

4

1 回答 1

12

采用:

... WHERE pg_stat_activity.datname = :'name'

注意冒号在单引号之前的位置。
手册

如果参数中出现不带引号的冒号 ( :) 后跟 psql 变量名,则将其替换为变量的值,如下面的SQL 插值中所述。那里的表格 :'variable_name':"variable_name"描述也有效。

和:

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

于 2012-08-30T02:00:00.313 回答