一、多数据库settings配置
假设有一个Mydjango的项目为例,在项目中创建应用index和user,并在配置文件settings.py的INSTALLED_APPS中注册。
下面以连接3个数据库示例:
分别是项目内置的db.sqlite3、MySQL的indexdb和userdb。
# settings.py中的DATABASES
# 其中default为Django默认使用的数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'db1': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'indexdb',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'localhost',
'port': '3306',
},
'db2': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'userdb',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'localhost',
'port': '3306',
},
}
除了设置DATABASES属性之外,还需要设置配置属性DATABASE_ROUTERS和DATABASE_APPS_MAPPING,配置信息如下:
# 记得还要新增dbRouter.py并编写类DbAppsRouter
DATABASE_ROUTERS = ['MyDjango.dbRouter.DbAppsRouter']
DATABASE_APPS_MAPPING = {
# 设置每个app的模型使用的数据库
# {'app_name' : 'database_name'}
'admin': 'default',
'index': 'db1',
'user': 'db2',
}
二、创建dbRouter.py文件并编写类DbAppsRouter
由于DATABASE_ROUTERS指向MyDjango文件夹的dbRouter.py文件,因此在MyDjango文件夹里创建dbRouter.py文件,文件名并不固定,可自行命名,只需与settings对应即可。类名同理。
from django.conf import settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
class DbAppsRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None
def db_for_write(self, model, **hints):
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None
def allow_relation(selfs, obj1, obj2, **hints):
db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None
# 用于创建数据表
def allow_migrate(self, db, app_label, model_name=None, **hints):
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(app_label) == db
elif app_label in DATABASE_MAPPING:
return False
return None
变量DATABASE_MAPPING从配置文件里获取配置属性DATABASE_APPS_MAPPING的值;类DbAppsRouter根据变量DATABASE_MAPPING(数据库与项目的映射关系)来设置数据库的读取、写入、数据表关系和数据迁移。