Django TestCase не использует транзакции на вторичной базе данных
Я использую Django 1.3.1. У меня есть две базы данных, некоторые из моих моделей живут в одной базе данных, некоторые в другой. Обе базы данных являются базами данных contrib.gis.db.backends.postgis.
К моему удивлению, TestCase от Django не откатывает изменения, которые я сделал во вторичной базе данных между тестами.
В следующем коде myproject.models.WellOwner представляет собой очень простую модель, которая в основном имеет только поле «имя». Маршрутизатор говорит, что он должен быть во вторичной базе данных. Утверждение в первом тесте успешно, второй тест не пройден:
<code>from django.test import TestCase from myproject.models import WellOwner class SimpleTest(TestCase): def test1(self): WellOwner.objects.create(name="Remco") self.assertEquals(1, WellOwner.objects.count()) # Succeeds class SimpleTest2(TestCase): def test2(self): # I would expect to have an empty database at this point self.assertEquals(0, WellOwner.objects.count()) # Fails! </code>
Я предполагаю, что Django включает это в транзакцию в базе данных по умолчанию, но не во вторичной базе данных. Это известная проблема? Есть ли исправление? В 1.4 возможно? Мой Google-фу не работает.
(если я изменю DATABASE_ROUTERS на [] в настройках, чтобы все входило в одну базу данных, проблема исчезнет)
Я добавлю весь код маршрутизатора на случай, если это поможет:
<code>SECONDARY_MODELS = ('WellOwner', ...) import logging logger = logging.getLogger(__name__) class GmdbRouter(object): """Keep some models in a secondary database.""" def db_for_read(self, model, **hints): if model._meta.app_label == 'gmdb': if model._meta.object_name in SECONDARY_MODELS: return 'secondary' return None def db_for_write(self, model, **hints): # Same criteria as for reading return self.db_for_read(model, **hints) def allow_syncdb(self, db, model): if db == 'secondary': if model._meta.app_label in ('sites', 'south'): # Hack for bug https://code.djangoproject.com/ticket/16353 # When testing, create django_site and south in both databases return True return self.db_for_read(model) == 'secondary' else: # Some other db if model._meta.app_label == 'gmdb': # Our models go in the other db if they don't go into secondary return self.db_for_read(model) != 'secondary' # Some other model in some other db, no opinion return None </code>