如何在set_jsonb没有更新密钥时抛出错误?

时间:2016-08-19 10:00:20

标签: postgresql psycopg2 postgresql-9.5

我在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。这是我列表中的下一个修复程序。现在我需要弄清楚如何处理不更新的密钥。

2 个答案:

答案 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)

结果将是truefalse