2012-04-12 12 views
7

पर लेनदेन का उपयोग नहीं कर रहा है मैं Django 1.3.1 का उपयोग कर रहा हूँ। मेरे पास दो डेटाबेस हैं, मेरे कुछ मॉडल एक डेटाबेस में रहते हैं, कुछ दूसरे में। दोनों डेटाबेस contrib.gis.db.backends.postgis डेटाबेस हैं।Django TestCase माध्यमिक डेटाबेस

मेरे आश्चर्य के लिए, Django का टेस्टकेस परीक्षणों के बीच द्वितीयक डेटाबेस में किए गए परिवर्तनों को वापस नहीं ले रहा है।

निम्नलिखित कोड में, myproject.models.WellOwner एक बहुत ही सरल मॉडल है जो मूल रूप से केवल "फ़ील्ड" फ़ील्ड होता है। राउटर का कहना है कि यह द्वितीयक डेटाबेस में होना चाहिए। पहले टेस्ट में दावे सफल होता है, दूसरे टेस्ट में विफल रहता है:

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

आप को शामिल करना चाहिए अपने प्रश्न में राउटर। यही वह जगह है जहां समस्या हो सकती है। –

+0

मेरे पास एक समान मामला है जहां 'integrityerror' के लिए 'connection._rollback()' फिक्स ठीक है, जैसे ही मैं मॉडल को एक अलग डेटाबेस में ले जाता हूं। इसके अलावा मॉडल पोस्ट करें, तो हो सकता है कि 'django.contrib.gis.db.models' – RickyA

+0

हे रेमकोर्गलिच में कुछ गड़बड़ है, क्या आपको कभी भी एक प्रस्ताव मिला है? मैं एक ही मुद्दे के साथ संघर्ष कर रहा हूं http://stackoverflow.com/questions/12205855/factory-boy-instance-within-testcase-causes-unique-contraint-violation –

उत्तर

संबंधित मुद्दे