【问题标题】:Django Migrate With Specific Database And ModelsDjango Migrate 使用特定的数据库和模型
【发布时间】:2021-01-14 11:40:41
【问题描述】:

我试图创建一个多数据库并且我做到了。我在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'     

然后我创建了一个名称文件为 dbrouters 和类为 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

但是问题。当我尝试执行该命令时,它们两个模型总是创建到两个数据库中。目标是,我希望模型 android 只是在 android 数据库中创建为一个表,对于 ios 模型也喜欢相同的条件。

【问题讨论】:

    标签: python django database django-models migrate


    【解决方案1】:

    您可以尝试类似的方法(更多信息请参阅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
    

    【讨论】:

    • 抱歉重播晚了,对于条件app_label,你给我一个例子,将数据库名称放在app_label列表中。我的意思是,那是 app_label 或 db 名称?
    • 因为我已经尝试过你的例子,但是当我运行python manage.py migrate --database=android时仍然没有工作@
    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 2015-10-10
    • 2016-09-22
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多