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

Update single element in jsonb column with sqlalchemy core

我在 table 中有一个 jsonb 列,其中每个元素的形式为

{id: str, value: bool}

我想更新与 ID 匹配的单个(或多个)元素。有没有一种惯用的方法可以使用 sqlalchemy core(不是 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 functions