Postgresql 当set#jsonb不';不更新密钥吗?
我正在psycopg2中运行此查询: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中。似乎当密钥无法更新时,不会引发异常。我已将“如果密钥不存在,
"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
时,查询才会返回任何行。对于这种情况,您可以使用simplecoalesce
。@klin在where
子句中失败正是我所指的。将一个值合并到一个不存在的行中并不是一件小事。选中选择coalesce(null,false),其中false
但不能在更新时返回true
,因为它在密钥不存在时也会返回。。我的意思是coalesce
包装在整个查询中。@klin只需替换为您的规则即可实现它。据我所知,OP没有要求它。OP写道:当使用set_jsonb()更新密钥失败时