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来解决它,但我更喜欢它们在同一个脚本中,因为它们实际上是两个步骤在一个过程中。
答案 0 :(得分:10)
尝试:
WHERE pg_stat_activity.datname = :'name'
请注意在单引号前放置冒号。优秀的手册填写了详细信息here:
如果不带引号的参数以冒号(:)开头,则将其视为psql 变量和变量的值用作参数 代替。如果变量名称被单引号括起来(例如 :'var'),它将作为SQL文字进行转义,结果将是 用作参数。如果变量名称被double包围 引号,它将作为SQL标识符进行转义,结果将是 用作论据。
大胆强调我的。