Python DJango在数据库之间切换
我是python和DJango的新手,所以如果可以的话,请详细解释。 我想在DJango 3数据库中使用: 1) 对于DJango auth、admin等 2) 对于本地网站商店 3) 对于主数据库 首先,在我的旧项目(PHP)中,我使用了两个数据库: *第一个数据库(本地数据库): ->此数据库在我的webhost上运行,包含主数据库的一些变量 *第二个数据库(主数据库): ->包含许多本地数据库不在其中的表和行 因此,我想制作一个脚本,按照以下顺序读取表: 身份验证>本地数据库>主数据库 例: *Localdatabase具有以下表: ->汽车品牌 ->自动零件Python DJango在数据库之间切换,python,django,Python,Django,我是python和DJango的新手,所以如果可以的话,请详细解释。 我想在DJango 3数据库中使用: 1) 对于DJango auth、admin等 2) 对于本地网站商店 3) 对于主数据库 首先,在我的旧项目(PHP)中,我使用了两个数据库: *第一个数据库(本地数据库): ->此数据库在我的webhost上运行,包含主数据库的一些变量 *第二个数据库(主数据库): ->包含许多本地数据库不在其中的表和行 因此,我想制作一个脚本,按照以下顺序读取表: 身份验证>本地数据库>主数据库 例
- main数据库包含以下表: ->AllAutoBrands ->所有部分
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'}
。现在进行迁移并再次单独应用它们。