Мне нужно обновить много строк (с шагом по одному значению в каждой строке) в базе данных peewee (SqliteDatabase
).Некоторые объекты могут быть не созданы, поэтому я должен создать их со значениями по умолчанию, прежде чем работать с ними.Я бы использовал способы, которые есть в документах peewee ( Атомные обновления ), но я не мог понять, как смешивать model.get_or_create()
и in [my_array]
.
Поэтому я решил сделать запросы втранзакция для ее фиксации один раз в конце (я надеюсь, что это так)4 рабочих) в Хьюи, потому что .atomic()
блокирует соединение (peewee.OperationalError: database is locked
).Я пытался использовать @huey.lock_task
, но это не решение моей проблемы, как я нашел.
Код моего класса:
class Article(Model):
name = CharField()
mention_number = IntegerField(default=0)
class Meta:
database = db
Код моего задания:
@huey.task(priority=30)
def update(names): # "names" is a list of strings
with db.atomic():
for name in names:
article, success = Article.get_or_create(name=name)
article.mention_number += 1
article.save()