7
我正在使用Django 1.3.1。我有两个数据库,我的一些模型存在于一个数据库中,另一些存在于另一个数据库中。这两个数据库都是contrib.gis.db.backends.postgis数据库。Django TestCase不使用辅助数据库上的事务
令我惊讶的是,Django的TestCase没有回滚测试之间在辅助数据库中所做的更改。
在下面的代码中,myproject.models.WellOwner是一个非常简单的模型,基本上只有一个字段“name”。路由器说它应该在辅助数据库中。在第一次测试的断言成功,第二次测试失败:
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!
我认为Django的包装此默认数据库的事务,而不是辅助数据库。这是一个已知的问题吗?有没有修复?也许在1.4?我的Google-fu失败了。
(如果我更改了设置DATABASE_ROUTERS为[]让一切都进入同一个数据库,问题就会消失)
我会添加路由器的整个代码,在情况下,它可以帮助:
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
你应该包括你的问题中的路由器。这就是问题所在。 – 2012-04-12 11:31:03
我有一个类似的情况,''integrityerror'的'connection._rollback()'修复程序不再工作了,只要我将模型移动到一个单独的数据库。也是postgis模型,所以'django.contrib.gis.db.models'中可能有问题' – RickyA 2012-08-09 08:26:07
嘿RemcoGerlich,你有没有找到一个解决方案?我正在努力解决相同的问题http://stackoverflow.com/questions/12205855/factory-boy-instance-within-testcase-causes-unique-contraint-violation – 2012-09-04 23:48:47