Массовое обновление с использованием библиотеки Peewee - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь обновить много записей в таблице, используя библиотеку 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. В поисках я нашел следующие решения:

  1. Выполнение необработанного запроса с использованием CASE: Ссылка
  2. Использование replace_many: Ссылка
  3. Использование update: Ссылка

Но я не смог найти примеров того, как использовать второе или третье решение. Кто-нибудь может прояснить, как можно использовать случаи 2 и 3?

Ответы [ 2 ]

0 голосов
/ 28 июля 2019

Новый лучший ответ - использовать найденный метод bulk_update() здесь :

with database.atomic():
    User.bulk_update(user_list, fields=['username'], batch_size=50)
0 голосов
/ 30 августа 2018

Требуется метод .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 / ru / latest / peewee / api.html # Дело

...