Postgresql 当set#jsonb不';不更新密钥吗?

Postgresql 当set#jsonb不';不更新密钥吗?,postgresql,psycopg2,postgresql-9.5,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中。似乎当密钥无法更新时,不会引发异常。我已将“如果密钥不存在,

我正在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中。似乎当密钥无法更新时,不会引发异常。我已将“如果密钥不存在,则创建新密钥”设置为false。是否可能引发错误,以便在使用
set_jsonb()
更新密钥失败时处理该错误


另外,我知道我不应该使用python格式传递参数。这是我名单上的下一个补丁。现在我需要弄清楚如何处理不更新的密钥。

当密钥不存在时,函数
jsonb_set()
不会引发异常

使用
返回
并检查代码中的结果:

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

返回
仅当更新成功时才会返回一行(
where
子句生成
true
)。否则将不予退还。要有一个值来测试
联合
返回失败行的集合(可能为空):

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

这是一个很好的解决方案。非常感谢,这不是真的。请注意,即使键不存在,也会更新该行。只有在未找到
id
时,查询才会返回任何行。对于这种情况,您可以使用simple
coalesce
。@klin在
where
子句中失败正是我所指的。将一个值合并到一个不存在的行中并不是一件小事。选中
选择coalesce(null,false),其中false
但不能
在更新时返回true
,因为它在密钥不存在时也会返回。。我的意思是
coalesce
包装在整个查询中。@klin只需替换为您的规则即可实现它。据我所知,OP没有要求它。OP写道:当使用set_jsonb()更新密钥失败时