使用 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)
但它替换了所选行中的列,因此可能不符合您的条件。
我在 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)
但它替换了所选行中的列,因此可能不符合您的条件。