Команда 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•••,
}
}
Обратите внимание, что это не серебряная пуля, и это странное требование. Это не переносимо, и вы будете находиться во власти базовой библиотеки базы данных и ее поведения, если только не захотите манипулировать и этим.
Всем нужны функции отката транзакций, когда что-то идет не так (например, сбой в сети во время процедуры оплаты). Причину, по которой вам это не нужно, я называю странной.