Модель Django возвращает count() 0, но вызывает ошибку IntegrityError при одиночной записи bulk_create/save в тестовом примере
У меня есть тестовый пример для пересчета значений в моей базе данных.
Поток:
- Инициальный расчет ( записи добавлены в несколько моделей/таблиц)
- Сброс данных (удаление связанных вычисленных данных)
- Re-calculate (записи добавлены в несколько моделей/таблиц)
Итак, мой тестовый пример выглядит примерно так:
assert DataModel1.objects.count() == 0
assert DataModel2.objects.count() == 0
plan = prepare_plan()
calculation_manager = CalculationManager()
# initial calculation
calculation_manager.schedule(plan)
# confirm data populated
self.assertTrue(DataModel1.objects.count())
self.assertTrue(DataModel2.objects.count())
perform_reset(plan)
# confirm data deleted
assert DataModel1.objects.count() == 0
assert DataModel2.objects.count() == 0
# re-calculate
calculation_manager.schedule(plan)
При попытке пересчета calculation_manager.schedule(plan)
возникает IntegrityError - duplicate key value violates constraint
ошибка для DataModel2 на bulk_create, несмотря на удаление и подтверждение DataModel2.objects.count() == 0
и подтверждение того, что bulk_create передается только одна запись.
(Также попробовал заменить bulk_create на save и результат был тот же)
Внутри функции perform_reset(plan)
и функций/методов calculation_manager.schedule(plan)
находятся блоки atomic()
, в которых результаты фиксируются в базе данных или элементы удаляются.
--
Я пробовал переключаться между использованием TestCase/TransactionTestCase без разницы в результатах.
Я обнаружил, что выполнение ручного усечения таблицы SQL после perform_reset(plan)
приводит к тому, что тест-кейс выполняется, как и ожидалось, но это не должно быть необходимо.
Почему при выполнении delete в тесткейсе и возвращении значения 0 django выбрасывает ошибку IntegrityError, как будто удаленное значение осталось в базе данных? Может быть, он не полностью удаляет объекты из таблиц во время тестовых примеров?