如何使用sqlalchemy核心进行批量更新?为每个条目更新不同的列

时间:2018-03-05 16:56:30

标签: python sqlalchemy bulkupdate

如果我事先知道了列,我可以更新多个值,但如果不想对列值进行硬编码,则无法创建批量更新。

请考虑以下事项:

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()

然而,这需要我总是提供所有列 - 即使我不想更新这些列。

1 个答案:

答案 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中有记录: