SQLAlchemy 中 JSONB 列的批量更新

3

如何正确地更新多行数据 - 特别是在不设置整个列的情况下更新行内的 JSONB 字段(但添加新键到 JSONB 列)?

类似于 -

data_mappings = [{
    'id': 1, 
    'dynamic': {'new_key': 'some_value'}
}, ...]

session.bulk_update_mappings(Data, data_mappings)
session.commit()

'dynamic'列应该保留旧数据,并将new_key添加到其中。

你能想出使用bulk_update_mappings进行JSONB更新的方法吗? - Zhenshan Jin
1个回答

1
我找到了一个解决方案。实际上,PostgreSQL支持在单个查询中更新多个JSON字段。
UPDATE a_table 
SET json_column= json_column :: jsonb || '{"key": {"key1": 11}, "key2": {"key2": 22}}' 
WHERE
    id = 'the_id';

SQLAlchemy的作用:

stmt =  update(Atable).values(
        json_column=(Atable.json_column.cast(JSONB) + json.dumps({"key": {"key1": 11}, "key2": {"key2": 22}}))).where(Atable.id == "the_id")
print(stmt) # check the raw sql
db.session.execute(stmt)
db.session.commit()

使用SQLAlchemy更新多条记录:

data_mappings = [{
    'id': 1, 
    'dynamic': json.dumps({'new_key': 'some_value'})
},]
stmt =  update(Atable).values(
        json_column=(Atable.json_column.cast(JSONB) + bindparam['dynamic'])).where(Atable.id == bindparam('id'))
print(stmt) 
db.session.execute(stmt, data_mapping)
db.session.commit()

更新一个字段,参考SQLAlchemy的func.jsonb_set函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接