SQLAlchemy中实现批量更新

​ 如果在MySQL中你想批量更新一些已经准备好的数据而不是简单的UPDATE SET的话,还是有点小难办的。去网上查询会建议你使用INSERT ... ON DUPLICATE KEY UPDATE等方法。

虽然INSERT ... ON DUPLICATE KEY UPDATE不失为一个好的方法,但是总觉得怪怪的,我认真谷歌了一下发现SQLAlchemy官方还是支持批量更新的实现,只是最后将语句转化成了一条条的UPDATE SET语句。

Stack Overflow的讨论话题Bulk update in SQLAlchemy Core using WHERE

我们看下例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from sqlalchemy.sql.expression import bindparam
stmt = teacher.update().where(
teacher.c.id == bindparam('_id') # 这里是查询匹配条件 一般是主键或者唯一键等
).values(
{
'user_id': bindparam('user_id'),
'email_address': bindparam('email_address'),
'address': "皇后大道", # 如果这里写了常量 下面匹配到的 address 字段 都要更新为皇后大道
}
)

conn.execute(stmt, [
{'user_id': 1, 'email_address': 'jack@yahoo.com', '_id': 1},
{'user_id': 1, 'email_address': 'jack@msn.com', '_id': 2},
{'user_id': 2, 'email_address': 'www@www.org', '_id': 3},
{'user_id': 2, 'email_address': 'wendy@aol.com', '_id': 4},
])

上面 最后还是要拆成四条 UPDATE SET语句执行的

我们看下aiomysql相关的源码
ruhVRs.png

当参数是多个值的时候 会执行executemany函数

ruhloF.png

推荐阅读:

How to update multiple rows at once in MySQL?

Inserts, Updates and Deletes

知识就是财富