情况相当模糊,尝试了几个小时的不同事情却没有运气。
我有一个 bash 脚本,可以在本地恢复生产数据库备份。该脚本的一部分运行一些 SQL 来设置数据库中的内容。
其中一项是slack_token
在slack_details
表格中设置正确的值。以下是我运行 bash 脚本的方法:
$ ./restore-prod-database.sh -t "xoxb-1234567-1234....."
该脚本有一行触发运行 .sql 文件,如下所示:
psql -h $DATABASE_HOST -d $DATABASE_NAME -a -v slack_token=$SLACK_TOKEN -f restore-populate-slack-details.sql
最后,SQL 执行如下操作:
UPDATE slack_details
SET installation = jsonb_set(installation, '{bot,token}', ('"' || :slack_token ||'"')::jsonb)
WHERE id = 1;
无论我尝试什么,无论是用引号连接 :slack_token、用引号传递它、使用单引号和 " 我都会收到以下错误:
更新 slack_details SET 安装 = jsonb_set(安装, '{bot,token}', ('"' || :slack_token ||'"')::jsonb) WHERE id = 1; psql:restore-populate-slack-details.sql:61: 错误: 列“xoxb”不存在第 2 行: ... = jsonb_set(installation, '{bot,token}', ('"' || xoxb- 12345...
快速注意,安装是一个 jsonb 列,以下代码工作正常,当我使用 -v 变量时它不起作用:
UPDATE slack_details
SET installation = jsonb_set(installation, '{bot,token}', ('"' || '123456' ||'"')::jsonb)
WHERE id = 1; --- works fine
要将
:slack_token
变量作为 SQL 查询中的文字注入,正确的语法是:'slack_token'
。来自“SQL插值”中的psql文档:
该查询可以写为:
此外,正如 @jjanes 下面所评论的,应该使用 来简化 jsonb 值的构造并使其更安全
to_jsonb
,否则令牌内缺少引号可能会导致具有某些值的无效 json 字符串:slack_token
: