Używam Django 1.3.1. Mam dwie bazy danych, niektóre z moich modeli znajdują się w jednej bazie danych, inne w drugiej. Obie bazy danych to bazy danych contrib.gis.db.backends.postgis.Django TestCase nie używa transakcji w drugorzędnej bazie danych
Ku mojemu zaskoczeniu, Django's TestCase nie cofa zmian, które wprowadziłem w drugorzędnej bazie danych między testami.
W poniższym kodzie myproject.models.WellOwner jest bardzo prostym modelem, który zasadniczo ma tylko pole "nazwa". Router mówi, że powinien znajdować się w dodatkowej bazie danych. Stwierdzenie w pierwszej próbie uda, drugi test nie powiedzie się:
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!
Zakładam, że Django zawija to w transakcji na domyślnej bazie danych, ale nie na wtórnym bazie. Czy to znany problem? Czy jest poprawka? W 1.4 może? Moje Google-fu zawodzi.
(jeśli zmienię DATABASE_ROUTERS do [] w ustawieniach tak, że wszystko idzie do tej samej bazy danych, problem znika)
dodam cały kod routera, w przypadku pomaga:
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
należy podać swoje routery w pytaniu. Tam może być problem. –
Mam podobny przypadek, w którym poprawka 'connection._rollback()' dla 'integrityerror' nie działa, jak tylko przeniesię model do oddzielnej bazy danych. Również modele postgis, więc może coś jest nie tak w 'django.contrib.gis.db.models' – RickyA
hej RemcoGerlich, czy kiedykolwiek znalazłeś rozwiązanie? Mam problem z tym samym problemem http://stackoverflow.com/questions/12205855/factory-boy-instance-within-testcase-causes-unique-contraint-violation –