Команда Django не применяет изменения при возникновении исключения

Я создал команду django для удаления около 100 000 записей в нашей базе данных, однако мы протестировали ее и заметили, что когда команда завершается или иным образом вызывает исключение, функция .delete() не применяется.

Например, команда находится на 100 из 100.000, и мы завершаем команду, все записи все еще там, и те 100, которые должны исчезнуть, все еще там.

Кто-нибудь знает, почему это происходит и можно ли отключить это поведение. Я знаю, что это может быть опасно, но нам это нужно :)

Я пытался посмотреть на реализацию, но не могу разобраться.

На самом деле Django по умолчанию работает в режиме autocommit, если не активна транзакция. В вашем случае транзакция является активной.

Django неявно использует транзакции во время операций, требующих многократных запросов, особенно delete() и update() запросов, чтобы гарантировать целостность этих операций ORM.

Итак, то, что вы испытываете, - это откат транзакции из-за завершения delete() запроса.

Хотя вы не можете отключить неявное использование транзакций для конкретного запроса, вы можете полностью отключить использование транзакций Django на сервере баз данных.


settings.py

DATABASES = {
    "default": {
        "AUTOCOMMIT": False,
        "ENGINE": "django.db.backends.•••",
        #•••Rest of code•••,
    }
}

Обратите внимание, что это не серебряная пуля, и это странное требование. Это не переносимо, и вы будете находиться во власти базовой библиотеки базы данных и ее поведения, если только не захотите манипулировать и этим.

Всем нужны функции отката транзакций, когда что-то идет не так (например, сбой в сети во время процедуры оплаты). Причину, по которой вам это не нужно, я называю странной.

Вернуться на верх