2016-02-24 8 views
8

मुझे डेटा माइग्रेशन बनाने के साथ कठिन समय है। मैं अपने ऐप्स के लिए दो डेटाबेस का उपयोग करता हूं। मैंने settings.py में डेटाबेस कॉन्फ़िगर किया और Django docs में राउटर भी बनाया।कई डेटाबेस के साथ Django माइग्रेशन

# hunt.models.py 

class Dish(models.Model): 
    """ 
    Investigation case 
    """ 
    display_name = models.CharField(max_length=64, unique=True) 
    department = models.ForeignKey(Kitchen, null=True) 
    case_type = models.PositiveSmallIntegerField(choices=CASE_TYPE_CHOICES, default=DEF_CASE_TYPE) 
    created_at = models.DateTimeField(blank=True, null=True) 
    comment = models.CharField(max_length=256, blank=True, null=True) 

    class Meta: 
     verbose_name = 'case' 
     app_label = 'hunt' 

    def __unicode__(self): 
     return (u'%s (%s)' % (self.display_name, self.created_at)).strip() 


# hunt.migrations.0001_initial.py 

class Migration(migrations.Migration): 

    app_label = 'hunt' 

    dependencies = [ 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='Dish', 
      fields=[ 
       ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)), 
       ('display_name', models.CharField(max_length=64, unique=True)), 
       ('case_type', models.PositiveSmallIntegerField(default=0, choices=[(0, 'Unknown'), (1, 'General'), (2, 'Terror'), (3, 'Narco'), (4, 'Fraud'), (5, 'Slavery'), (6, 'Traffic'), (7, 'RICO'), (8, 'War'), (9, 'Cyber'), (20, 'Other')])), 
       ('created_at', models.DateTimeField(null=True, blank=True)), 
       ('comment', models.CharField(max_length=256, null=True, blank=True)), 
      ], 
      options={ 
       'verbose_name': 'case', 
      }, 
     ), 
    ] 

# hunt.migrations.0002_add_hunts.py 


def create_initial_hunts(apps, schema_editor): 

    if settings.DEBUG:  
     print('\nContent added') 


class Migration(migrations.Migration): 
    dependencies = [ 
     ('hunt', '0001_initial'), 
    ] 


    operations = [ 
     migrations.RunPython(create_initial_hunts, hints={'schema_editor': 'other'}), 
    ] 

समस्या है:: जब मैं चलाने "विस्थापित" कमांड, कि डेटाबेस डिफ़ॉल्ट से जुड़ा माइग्रेट किए जाते हैं केवल अनुप्रयोगों

# settings.py 
DB_HOST = 'localhost' 
DATABASES = { 
'default': { 
    'ENGINE': 'django.db.backends.mysql', 
    'NAME': 'helios', 
    'HOST': DB_HOST, 
    'OPTIONS': { 
     'read_default_file': join(dirname(__file__), 'default.cnf'), 
    }, 
}, 
'other': { 
    'ENGINE': 'django.db.backends.mysql', 
    'NAME': 'gala_pol', 
    'HOST': DB_HOST, 
    'OPTIONS': { 
     'read_default_file': join(dirname(__file__), 'other.cnf'), 
    }, 
}, 

DATABASE_APPS_MAPPING = { 
    'contenttypes': 'default', 
    'auth': 'default', 
    'admin': 'default', 
    'sessions': 'default', 
    'messages': 'default', 
    'staticfiles': 'default', 
    'woodsmen': 'default', 
    'helios': 'default', 
    'hush': 'default', 
    'hunt': 'other', 
    'meat': 'other', 
    'beast': 'other', 
} 

# routers.py 

class DatabaseAppsRouter(object): 

    def db_for_read(self, model, **hints): 

     if model._meta.app_label in settings.DATABASE_APPS_MAPPING: 
      return settings.DATABASE_APPS_MAPPING[model._meta.app_label] 
     return None 

    def db_for_write(self, model, **hints): 

     if model._meta.app_label in settings. 
      return settings.DATABASE_APPS_MAPPING[model._meta.app_label] 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 

     db1 = settings.DATABASE_APPS_MAPPING.get(obj1._meta.app_label) 
     db2 = settings.DATABASE_APPS_MAPPING.get(obj2._meta.app_label) 
     if db1 and db2: 
      return db1 == db2 
     return None 

    def allow_migrate(self, db, app_label, model_name=None, **hints): 

     if db in settings.DATABASE_APPS_MAPPING.values(): 
      return settings.DATABASE_APPS_MAPPING.get(app_label) == db 
    elif app_label in settings.DATABASE_APPS_MAPPING: 
      return False 

यहाँ मॉडल और उन क्षुधा में से एक की माइग्रेशन है। शेष ऐप्स में माइग्रेशन कभी नहीं चलते हैं। अगर मैं इस तरह के ऐप के लिए माइग्रेट लॉन्च करता हूं --डेटाबेस विकल्प - यह ठीक काम करता है।

मैं प्रति माइग्रेशन डेटाबेस कैसे निर्दिष्ट कर सकता हूं? राउटर वास्तव में इसका प्रबंधन नहीं करना चाहिए? या मुझे कुछ और याद आया?

उत्तर

10

आपको प्रत्येक डेटाबेस के लिए migrate चलाने के लिए --database के साथ लक्ष्य निर्दिष्ट करना होगा। प्रत्येक बार यह आपके राउटर से परामर्श करेगा कि यह देखने के लिए कि कौन से माइग्रेशन वास्तव में उस डेटाबेस पर प्रदर्शन करते हैं।

मुझे लगता है कि यह इस तरह से डिजाइन किया गया था कि यह प्रभावहीनता पर स्पष्टता का पक्ष ले सके। उदाहरण के लिए, आपके वर्कफ़्लो के लिए आपको विभिन्न समय पर अलग-अलग डेटाबेस माइग्रेट करने की आवश्यकता हो सकती है।

नोट, हालांकि, आप, उत्पादन जो माइग्रेशन वास्तव में प्रदर्शन किया गया से बताने के लिए सक्षम नहीं होगा कि since:

माइग्रेशन बस चुपचाप एक मॉडल है जो के लिए यह रिटर्न False पर कोई कार्रवाई करने नहीं होंगे ।

+1

धन्यवाद, मैंने यह ठीक से समाप्त कर दिया। –

+3

क्यों Django इस एकाधिक डीबी मुद्दे का समर्थन नहीं करता है, जब वे 'DATABASE_ROUTERS' प्रदान करते हैं? यह अजीब है। – dannydedog

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