Python DJango在数据库之间切换

Python DJango在数据库之间切换,python,django,Python,Django,我是python和DJango的新手,所以如果可以的话,请详细解释。 我想在DJango 3数据库中使用: 1) 对于DJango auth、admin等 2) 对于本地网站商店 3) 对于主数据库 首先,在我的旧项目(PHP)中,我使用了两个数据库: *第一个数据库(本地数据库): ->此数据库在我的webhost上运行,包含主数据库的一些变量 *第二个数据库(主数据库): ->包含许多本地数据库不在其中的表和行 因此,我想制作一个脚本,按照以下顺序读取表: 身份验证>本地数据库>主数据库 例

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

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

*第一个数据库(本地数据库): ->此数据库在我的webhost上运行,包含主数据库的一些变量

*第二个数据库(主数据库): ->包含许多本地数据库不在其中的表和行

因此,我想制作一个脚本,按照以下顺序读取表: 身份验证>本地数据库>主数据库

例: *Localdatabase具有以下表: ->汽车品牌 ->自动零件

  • main数据库包含以下表: ->AllAutoBrands ->所有部分
我一直在尝试连接多个数据库,但我不明白,为什么只读取其中的两个。 代码正在读取auth数据库和本地数据库

我有以下代码:

设置.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_品牌位于本地数据库中,“模型”位于主数据库中。 错误:


对不起我的英语。提前感谢

将您的
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
然后
python manage.py migrate--database=(foreach database)
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
然后
python manage.py migrate--database=(foreach database)

您是否进行了迁移并将其应用于各个数据库?嗯,我想是的。我应该再做一次吗?运行这些命令:
python manage.py makemigrations python manage.py migrate--database=(foreach数据库)
?如果成功且没有任何错误,则不会。您必须为每个数据库创建不同的应用程序,并相应地编写模型。在每个数据库路由器内定义
route\u app\u标签
,以便is可以根据
app\u标签
路由到正确的数据库。如果您还有任何疑问,请询问我,我不记得它是否没有错误。让我们假设是这样。你能给我举个例子吗?我应该复制粘贴类AuthRouter:并为每个数据库重命名它吗?是的,诸如此类。因此,假设
CarAuto
模型在
app1
中,
CarModels
app2
中,您希望
CarAuto
模型在
PrimaryReplicaRouter
中,而
CarModels
SecondaryReplicaRouter
中。因此,复制其他两个路由器中的
AuthRouter
内容,并更改
PrimaryReplicaRouter的
route_app_标签={'app1'}
,以及
SecondaryReplicaRouter的
route_app_标签={'app2'}
。现在进行迁移并再次单独应用它们。您进行迁移并将其应用于单个数据库了吗?嗯,我想是的。我应该再做一次吗?运行这些命令:
python manage.py makemigrations python manage.py migrate--database=(foreach数据库)
?如果成功且没有任何错误,则不会。您必须为每个数据库创建不同的应用程序,并相应地编写模型。在每个数据库路由器内定义
route\u app\u标签
,以便is可以根据
app\u标签
路由到正确的数据库。如果您还有任何疑问,请询问我,我不记得它是否没有错误。让我们假设是这样。你能给我举个例子吗?我应该复制粘贴类AuthRouter:并为每个数据库重命名它吗?是的,诸如此类。因此,假设
CarAuto
模型在
app1
中,
CarModels
app2
中,您希望
CarAuto
模型在
PrimaryReplicaRouter
中,而
CarModels
SecondaryReplicaRouter
中。因此,复制其他两个路由器中的
AuthRouter
内容,并更改
PrimaryReplicaRouter的
route_app_标签={'app1'}
,以及
SecondaryReplicaRouter的
route_app_标签={'app2'}
。现在进行迁移并再次单独应用它们。