DJango在数据库之间切换

时间:2020-05-09 04:43:03

标签: python django

我是python和DJango的新手,所以,如果可以的话,请详细解释。 我想在DJango 3数据库中使用: 1)对于DJango身份验证,管理员等 2)对于本地网站商店 3)对于主数据库

首先,在我的旧项目(PHP)中,我使用了两个数据库:

*第一数据库(localdatabase): ->该数据库正在我的虚拟主机上运行,​​并且包含一些用于主数据库的变量

*第二个数据库(主数据库): ->包含很多表和行,而本地数据库则不在其中。

所以我想制作一个脚本来按以下顺序读取表: Auth> Localdatabase> Maindatabase

例如: * Localdatabase有此表: ->汽车品牌 ->汽车配件

  • 主数据库具有以下表: ->所有汽车品牌 -> AllAutoParts。

我一直在尝试连接多个数据库,但我不明白,为什么只读取其中两个。 代码正在读取auth数据库和本地数据库。

我有此代码:

settings.py

DATABASES = {
    'default': {},
    'auth_db':
    {
        'NAME': 'gws2',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'root',
        'PASSWORD': '',
    },
    'primary': {
        'NAME': 'gws',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'root',
        'PASSWORD': '',
    },
    'secondary':{
        'NAME': 'gwsautqe_ocar890',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'root',
        'PASSWORD': 'UkVP0qdlle9TKP2z',
        'HOST': '46.231.42.12',
        'PORT': '3306',
    }
}

DATABASE_ROUTERS = ['gwsauto.routes.AuthRouter', 'gwsauto.routes.PrimaryReplicaRouter', 'gwsauto.routes.SecondaryReplicaRouter']

routes.py

class AuthRouter:
    route_app_labels = {'auth', 'contenttypes'}

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'auth_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'auth_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if (
            obj1._meta.app_label in self.route_app_labels or
            obj2._meta.app_label in self.route_app_labels
        ):
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.route_app_labels:
            return db == 'auth_db'
        return None

class PrimaryReplicaRouter:

    def db_for_read(self, model, **hints):
        return 'primary'

    def db_for_write(self, model, **hints):
        return 'primary'

    def allow_relation(self, obj1, obj2, **hints):
        db_list = ('primary')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

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

class SecondaryReplicaRouter:

    def db_for_read(self, model, **hints):
        return 'secondary'

    def db_for_write(self, model, **hints):
        return 'secondary'

    def allow_relation(self, obj1, obj2, **hints):
        db_list = ('secondary')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

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

models.py

从django.db导入模型

class CarModels(models.Model):   
    description = models.CharField(max_length=100)
    class Meta:
        db_table = "models"

class CarAuto(models.Model):
    BrandName =   models.CharField(max_length=100)
    class Meta:
        db_table = "gws_brands"

在当前代码上:GWS_brands在本地数据库上,“模型”在主数据库上。 错误: Error

对不起,我的英语。预先感谢

1 个答案:

答案 0 :(得分:0)

maven { url 'http://download.flutter.io' } 放在CarModels内,将app1/models.py放在CarAuto

路由器

app2/models.py

现在先运行class AuthRouter: route_app_labels = {'auth', 'contenttypes'} def db_for_read(self, model, **hints): if model._meta.app_label in self.route_app_labels: return 'auth_db' return None def db_for_write(self, model, **hints): if model._meta.app_label in self.route_app_labels: return 'auth_db' return None def allow_relation(self, obj1, obj2, **hints): if ( obj1._meta.app_label in self.route_app_labels or obj2._meta.app_label in self.route_app_labels ): return True return None def allow_migrate(self, db, app_label, model_name=None, **hints): if app_label in self.route_app_labels: return db == 'auth_db' return None class PrimaryReplicaRouter: route_app_labels = {'app1'} def db_for_read(self, model, **hints): if model._meta.app_label in self.route_app_labels: return 'primary' return None def db_for_write(self, model, **hints): if model._meta.app_label in self.route_app_labels: return 'primary' return None def allow_relation(self, obj1, obj2, **hints): db_list = ('primary', 'secondary') if obj1._state.db in db_list and obj2._state.db in db_list: return True return None def allow_migrate(self, db, app_label, model_name=None, **hints): if app_label in self.route_app_labels: return db == 'primary' return None class SecondaryReplicaRouter: route_app_labels = {'app2'} def db_for_read(self, model, **hints): return 'secondary' def db_for_write(self, model, **hints): return 'secondary' def allow_relation(self, obj1, obj2, **hints): db_list = ('secondary') if obj1._state.db in db_list and obj2._state.db in db_list: return True return None def allow_migrate(self, db, app_label, model_name=None, **hints): return True ,然后运行python manage.py makemigrations

相关问题