Django Test Fails with OperationalError on Tenant Deletion in Multi-Tenant PostgreSQL Setup
Я столкнулся со специфической проблемой при выполнении тестовых примеров в проекте Django, который включает в себя многопользовательскую установку базы данных PostgreSQL. Процесс, который я тестирую, заключается в удалении арендаторов, и примечательно, что эта ошибка появляется только во время тестов, в то время как реальное приложение работает без каких-либо проблем при реальном запуске.
Сообщения об ошибках: Во время выполнения теста я получаю две ошибки в последовательности:
django.db.utils.OperationalError: cannot DROP TABLE "model_name_1" because it has pending trigger events
django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block
Подробный контекст: Проблема проявляется при запуске Django-теста, проверяющего удаление арендатора и связанных с ним данных. В частности, ошибки возникают в строке, где арендатор удаляется с помощью tenant.delete(force_drop=True). В тестовом примере устанавливаются данные для моделей, включающих отношения внешних ключей, и именно при этих условиях наблюдаются ошибки:
def test_tenant_deletion(tenant, monkeypatch):
with tenant_context(tenant):
model_1.objects.create(name="Test date", process_id="process")
model_2.objects.create(name="Test date", model_1=model_1.objects.first())
payload = {
"eventId": "abcdef",
"type": "DELETED",
"tenant": {"tenantId": str(tenant.id)},
}
event = Mock(link=Mock(source=Mock(address="delete_tenant")), message=Mock(body=json.dumps(payload)))
listener = Listener(URL, USER, PASSWORD)
listener.on_message(event)
assert not Tenant.objects.filter(id=tenant.id).exists()
Наблюдения:
- Операция tenant.delete(force_drop=True) проходит без ошибок в реальном запуске.
- Ошибки характерны для среды тестирования, особенно когда тестовые данные включают ограничения по внешним ключам.
Примечание: я использую Pytest
Я попробовал использовать transaction.atomic(): и затем transaction.commit(), но получаю ошибку