2012-04-12 28 views
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 
+0

你應該包括你的問題中的路由器。這就是問題所在。 – 2012-04-12 11:31:03

+0

我有一個類似的情況,''integrityerror'的'connection._rollback()'修復程序不再工作了,只要我將模型移動到一個單獨的數據庫。也是postgis模型,所以'django.contrib.gis.db.models'中可能有問題' – RickyA 2012-08-09 08:26:07

+0

嘿RemcoGerlich,你有沒有找到一個解決方案?我正在努力解決相同的問題http://stackoverflow.com/questions/12205855/factory-boy-instance-within-testcase-causes-unique-contraint-violation – 2012-09-04 23:48:47

回答