使用 Peewee 库批量更新

Off*_*fue 6 python mysql sql-update peewee

我正在尝试使用Peewee库更新表中的许多记录。在循环内for,我获取一条记录,然后更新它,但这在性能方面听起来很糟糕,所以我需要批量更新。当前代码如下所示:

usernames_to_update = get_target_usernames()
for username in usernames_to_update:
    user = User.get(User.username == username) # username is primary key
    if user.type == 'type_1':
        user.some_attr_1 = some_value_1
    elif user.type == 'type_2':
        user.some_attr_2 = some_value_2
    # elif ....
    user.save()
Run Code Online (Sandbox Code Playgroud)

文档中,有insert_many功能,但没有类似的东西update_many。搜索周围我想出了这些解决方案:

  1. 使用以下命令执行原始查询CASE链接
  2. 使用replace_many链接
  3. 使用update链接

但我找不到任何如何使用第二个或第三个解决方案的示例。有人可以澄清如何使用案例 2 和 3 吗?

Dav*_*nat 5

新的最佳答案是使用此处bulk_update()找到的方法:

with database.atomic():
    User.bulk_update(user_list, fields=['username'], batch_size=50)
Run Code Online (Sandbox Code Playgroud)


col*_*fer 4

您需要 .update() 方法:

query = User.update(validated=True).where(User.username.in_(usernames_to_update))
query.execute()
Run Code Online (Sandbox Code Playgroud)

编辑:所以您想在更新期间有条件地设置该值。您可以使用Case助手。未经测试:

some_value_1 = 'foo'
some_value_2 = 'bar'
case_stmt = Case(User.type, [
    ('type_1', some_value_1),
    ('type_2', some_value_2)])
query = User.update(some_field=case_stmt).where(User.username.in_(list_of_usernames))
query.execute()
Run Code Online (Sandbox Code Playgroud)

文档可以在这里找到:http://docs.peewee-orm.com/en/latest/peewee/api.html#Case