簡體   English   中英

Django 使用特定數據庫和模型進行遷移

[英]Django Migrate With Specific Database And Models

我試圖創建一個多數據庫並且我做到了。 我在setting.py上寫了這樣的代碼:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'baseDB', 
        'USER': 'admin', 
        'PASSWORD': 'admin',
        'HOST': '127.0.0.1', 
        'PORT': '1234',
    },
    'android': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'androidDB', 
        'USER': 'admin', 
        'PASSWORD': 'admin',
        'HOST': '127.0.0.1', 
        'PORT': '1234',
    },
    'ios': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'iosDB', 
        'USER': 'admin', 
        'PASSWORD': 'admin',
        'HOST': '127.0.0.1', 
        'PORT': '1234',
    }       
}

而且我已經創建了兩個models.py,例如:

class AndroidModel(models.Model):
    name = models.CharField(default=False)
    version = models.CharField()
    
    class Meta:
        app_label = 'android_label'

class IosModel(models.Model):
    name = models.CharField(default=False)
    version = models.CharField()
    
    class Meta:
        app_label = 'ios_label'     

然后我創建了一個名稱為 dbrouter 的路由,class 是 MyDBRouter,代碼如下:

from api.models import AndroidModel, IosModel

class MyDBRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'android_label':
            return 'android'

        if UserJembatani._meta.app_label == 'ios':
            return 'ios'

        else:
            return 'default'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'android_label':
            return 'android'

        if UserJembatani._meta.app_label == 'ios_label':
            return 'ios'

        else:
            return 'default'

        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'android_label' or \
           obj2._meta.app_label == 'android_label':
           return True

        if obj1._meta.app_label == 'ios_label' or \
           obj2._meta.app_label == 'ios_label':
           return True

        else:
            return 'default'           
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if not UserJembatani._meta.app_label == 'android_label':
            return'android' == db

        if not UserJembatani._meta.app_label == 'ios_label':
            return'ios' == db

        else:
            return 'default' == db

        return None

我還把 DATABASE_ROUTERS 放在 setting.py 中:

DATABASE_ROUTERS = ('app_mobile.dbrouters.MyDBRouter',)

之后我真的使用命令行遷移它:

python manage.py migrate --database=android

python manage.py migrate --database=android

但是問題。 當我嘗試執行該命令時,它們兩個模型總是創建到兩個數據庫中。 目標是,我想要 model android 只需在 android 數據庫中創建一個表,對於 Z9E304D4E8DF1B74CFA009 模型也一樣。

您可以嘗試類似的方法(有關更多信息,請參閱https://www.webforefront.com/django/modelmultidatabases.html

def allow_migrate(self, db, app_label, model_name=None, **hints):
        if db == 'ios':            
            if app_label in ['auth','admin','ios']:
                return True            
            elif app_label=='android':                
                return False
        elif db == 'android':
            if app_label in ['auth','admin','android']:
                return True            
            elif app_label=='ios':                
                return False    
        return None

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM