使用peewee库进行批量更新

1cklez4t  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(603)

我正在尝试使用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()

在文件中,有 insert_many 功能,但不是 update_many . 我四处寻找,想出了以下解决办法:
使用执行原始查询 CASE :链接
使用 replace_many :链接
使用 update :链接
但是我找不到任何关于如何使用第二或第三种解决方案的例子。有人能解释一下案例2和案例3的用法吗?

dffbzjpn

dffbzjpn1#

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

with database.atomic():
    User.bulk_update(user_list, fields=['username'], batch_size=50)
2jcobegt

2jcobegt2#

需要.update()方法:

query = User.update(validated=True).where(User.username.in_(usernames_to_update))
query.execute()

编辑:所以您希望在更新期间有条件地设置值。你可以用 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()

文档可在此处找到:http://docs.peewee-orm.com/en/latest/peewee/api.html#case

相关问题