如果我事先知道了列,我可以更新多个值,但如果不想对列值进行硬编码,则无法创建批量更新。
请考虑以下事项:
stmt = task_table.update() \
.where(task_table.c.id == bindparam('idx')) \
.values(bindparam('values'))
vals = [{'idx': task.idx,
'values':{'queueStatus': task.queue_status, 'detail':str(task.idx)}}
for task in actions]
connection.execute(stmt, vals)
connection.commit()
这会产生错误AttributeError: Neither 'BindParameter' object nor 'Comparator' object has an attribute 'items'
。在values()
我可以将其更改为:
stmt = task_table.update() \
.where(task_table.c.id == bindparam('idx')) \
.values({queueStatus=bindparam('values'), detail=bindparam('detail')})
vals = [{'idx': task.idx,
'values':task.queue_status, 'detail':str(task.idx)}
for task in actions]
connection.execute(stmt, vals)
connection.commit()
然而,这需要我总是提供所有列 - 即使我不想更新这些列。
答案 0 :(得分:0)
我从您的示例中看到的唯一区别是,您尝试解压缩多个值而不指示要更新的特定列是什么,还要注意用于bindparams的受限名称,类似的东西应该可以工作:
stmt = (
task_table.update()
.where(task_table.c.id == bindparam('_idx'))
.values(
queueStatus=bindparam('_queue_status'),
detail=bindparam('_detail')
)
)
vals = [
{
'_idx': task.idx,
'_queue_status': task.queue_status,
'_detail': str(task.idx),
}
for task in actions
]
connection.execute(stmt, vals)
connection.commit()
这在the sqlalchemy docs中有记录: