繁体   English   中英

用 sqlalchemy 核心更新 jsonb 列中的单个元素

[英]Update single element in jsonb column with sqlalchemy core

我在表中有一个 jsonb 列,其中每个元素都是以下形式

{id: str, value: bool}

我想更新与 ID 匹配的单个(或多个)元素。 有没有一种惯用的方法可以使用 sqlalchemy核心(不是 ORM),而不需要读写整个列,或者手动构建 sql 查询?

基于这个答案,给定这个初始设置:

tbl = sa.Table(
    't71821876',
    sa.MetaData(),
    sa.Column('id', sa.Integer, primary_key=True),
    sa.Column('stuff', JSONB),
)

tbl.drop(engine, checkfirst=True)
tbl.create(engine)

with engine.begin() as conn:
    ins = tbl.insert()
    conn.execute(
        ins, [{'stuff': {'id': str(n), 'value': False}} for n in range(3)]
    )

我们可以像这样使用jsonb_set * 进行更新:

with engine.begin() as conn:
    stmt = (
        sa.update(tbl)
        .where(tbl.c.stuff['id'].astext == '0')
        .values(
            stuff=sa.func.jsonb_set(tbl.c.stuff, '{value}', json.dumps(True))
        )
    )
    conn.execute(stmt)

该页面上的其他答案可以翻译成

with engine.begin() as conn:
    stmt = (
        sa.update(tbl)
        .where(tbl.c.stuff['id'].astext == '1')
        .values(stuff=tbl.c.stuff + json.dumps({'id': '1', 'value': True}))
    )
    conn.execute(stmt)

但它替换了所选行中的列,因此可能不符合您的标准。


* Postgresql JSON 函数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM