我在psycopg2中运行此查询:
"UPDATE accounts SET user_settings=jsonb_set(user_settings, '{{{0}}}', to_jsonb('{1}'::text, false)) WHERE accounts.id = {2};".format(
key, val, account_id)
它包含在try / except中。似乎当密钥无法更新时,不会抛出任何异常。我已设置"如果密钥不存在,则创建新密钥"为假。是否可以抛出错误,以便在使用set_jsonb()
无法更新密钥时处理错误?
PS。我知道我不应该使用python格式传递params。这是我列表中的下一个修复程序。现在我需要弄清楚如何处理不更新的密钥。
答案 0 :(得分:1)
当密钥不存在时,函数jsonb_set()
不会引发异常。
使用returning
并检查代码中的结果:
UPDATE accounts
SET user_settings=
jsonb_set(
user_settings,
'{a_key}',
to_jsonb('new_value'::text),
false)
WHERE id = 1
RETURNING user_settings->>'a_key' = 'new_value';
当且仅当密钥存在且已更新时,查询才会生成true
。
答案 1 :(得分:0)
returning
才返回一行(where
子句产生true
)。否则将不会返回任何内容。要有一个值来测试union
返回集(可能为空)到失败行:
update = '''
with u as (
update accounts
set user_settings = jsonb_set(
user_settings, '{{{0}}}', to_jsonb('{1}'::text, false)
)
where accounts.id = {2};".format(key, val, account_id)
returning true as updated
)
select updated
from u
union all
select false
order by 1 desc
'''.format(key, val, account_id)
结果将是true
或false