sergey-gornostaev
@sergey-gornostaev
Седой и строгий

Как коммитить транзакцию в цикле?

Есть у меня проект, который начинался ещё с Django 1.4. Раз в час специальный management command парсит json-файл с примерно 200 000 записей и загружает их в базу. Естественно, это оооочень медленный процесс. Раньше его ускорению помогало ручное управление транзакцией: перед циклом транзакция начиналась и каждую 1000 записей коммитилась. Беда в том, что сейчас проект работает на 1.9, в котором такой способ больше не работает. В 1.9 есть декоратор и менеджер контекста transaction.atomic, который по понятным причинам в цикле неприменим, а пара transaction.set_autocommit(False) и transaction.commit() работает только на самых примитивных операциях, вроде последовательного создания в базе новых несвязанных записей. Не мой случай. Что делать? От ORM'а избавляться очень бы не хотелось.
  • Вопрос задан
  • 903 просмотра
Решения вопроса 1
@deliro
# data - твой датасет из 200000 элементов
while data:
    with atomic():
        do_something_atomic(data[:1000])
        del data[:1000]


Но я всё равно не понимаю, зачем тебе нужны транзакции. Не лучше ли в один инсерт засунуть 1000 значений?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы