场景: 不同的app使用不同的数据库
1. settings.py配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db1', # 数据库名称
'HOST': '12.0.0.0', # ip地址
'PORT': 3306, # 端口号
'USER': "sss", # 用户名
"PASSWORD": "sss", # 密码
},
'db_user': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db2', # 数据库名称
'HOST': '12.0.0.0', # ip地址
'PORT': 3306, # 端口号
'USER': "sss", # 用户名
"PASSWORD": "sss", # 密码
}
}
# 指定 app 对应 数据库
DATABASES_APPS_MAPPING = {
# 数据库与APP应用一一对应;
#app - 数据库对象参数名
'api': 'default',
'user': 'db_user',
}
2. 编写数据库路由文件
(1). 主应用 / database_app_router.py 编写数据库路由文件
from django.conf import settings
class DatabaseAppsRouter(object):
def db_for_read(self, model, **hints):
"""
:param model: 执行模型语句的类对象: <class 'app01.models.Publisher'>
:return: default,获取setting配置的DATABASES_APPS_MAPPING 对应的 app的值
"""
app_label = model._meta.app_label # app01, 获取app文件名
if app_label in settings.DATABASES_APPS_MAPPING:
res = settings.DATABASES_APPS_MAPPING[app_label] # default,获取setting配置的app的值
return res
return None
def db_for_write(self, model, **hints):
app_label = model._meta.app_label
if app_label in settings.DATABASES_APPS_MAPPING:
return settings.DATABASES_APPS_MAPPING[app_label]
return None
def allow_relation(self, obj1, obj2, **hints):
# 获取对应数据库的名字
db_obj1 = settings.DATABASES_APPS_MAPPING.get(obj1._mata.app_label)
db_obj2 = settings.DATABASES_APPS_MAPPING.get(obj2._mata.app_label)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None
def db_for_migrate(self, db, app_label, model_name=None, **hints):
if db in settings.DATABASES_APPS_MAPPING.values():
return settings.DATABASES_APPS_MAPPING.get(app_label) == db
elif app_label in settings.DATABASES_APPS_MAPPING:
return False
return None
3. settings.py添加指向数据库路由文件的路由变量
# 配置数据库的路由,里面的参数以.为分割,分别是Module文件夹名.数据库路由配置文件.数据库路由配置文件中的方法
DATABASE_ROUTERS = ['主应用名.database_app_router.DatabaseAppsRouter']