django--配置多个数据库
Posted 测试开发交流
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django--配置多个数据库相关的知识,希望对你有一定的参考价值。
Django系列
很多使用django的朋友应该知道,大部分时候都是用个一个数据库(不同的数据表),那么能否连接不同的数据库呢?
可以带着疑问看小徒弟的大文,解答你的疑惑~
1. 配置多个数据库
首先我们需要在settings.py中配置多个数据库连接
注意:第一个数据库必须为default
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'plum', # 你要存储数据的库名,事先要创建之
'USER': 'xxxx', # 数据库用户名
'PASSWORD': 'xxxx', # 密码
'HOST': '', # 主机
'PORT': '3306', # 数据库使用的端口
},
'is_a_testdata': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'test_data', # 你要存储数据的库名,事先要创建之
'USER': 'xxxx', # 数据库用户名
'PASSWORD': 'xxxx', # 密码
'HOST': 'xxxx', # 主机
'PORT': '3306', # 数据库使用的端口
}
}
2.在settings.py配置路由文件地址
DATABASE_ROUTERS = ['trf.database_router.DatabaseAppsRouter'] #这里 的值根据自己实际的命名来写
3. 创建路由管理文件
1.在manage.py的同级目录下创建trf文件夹
2.添加database_router.py文件
3.在database_router.py文件中添加DatabaseAppRouter类
4. 添加路由规则
4. 添加数据库别名与app名的对应关系
-- 注意以下代码全部在 trf.database_router.DatabaseAppsRouter中
# 添加数据库别名与app名的对应关系
DATABASE_MAPPING = {
'test_app': 'is_a_testdata',
'app_name1': 'db_nikename1',
'app_name2': 'db_nikename2',
...
}
4.2 添加读取规则
# 这里以django2.X为例
# 我们要为mytest单独配置一个数据库is_a_testdata
# 注意:(mytest是app的名字)
# 添加读取规则
def db_for_read(self, model, **hints):
# 配置每个app使用那个数据库读
if model._meta.app_label == 'mytest':
return 'is_a_testdata'
return None
# 我们也可以为每一个app单独配置一个写入数据库,
# 这里就用到了我们刚刚配置的数据库别名与app对应关系字典:
# DATABASE_APPS_MAPPING中的app
DATABASE_APPS_MAPPING = {
'mytest': 'is_a_testdata',
'app名1': '数据库别名1',
'app名2': '数据库别名2',
.....
}
def db_for_read(self, model, **hints){
if model._meta.app_label in DATABASE_APPS_MAPPING:
return DATABASE_APPS_MAPPING[model._meta.app_label]
return None
}
4.3 添加数据库写入规则
# 我们要为mytest单独配置一个数据库is_a_testdata 注意:(mytest是app的名字)
# 添加读取规则
def db_for_write(self, model, **hints):
# 配置每个app使用那个数据库读
if model._meta.app_label == 'mytest':
return 'is_a_testdata'
return None
# 我们也可以为每一个app单独配置一个写入数据库, 这里就用到了我们刚刚配置的数据库别名与app对应关系字典:DATABASE_APPS_MAPPING中的app
def db_for_write(self, model, **hints){
if model._meta.app_label in DATABASE_APPS_MAPPING:
return DATABASE_APPS_MAPPING[model._meta.app_label]
return None
}
4.4 配置是否允许数据库migate
# 添加允许迁移规则
def allow_migrate(self, db, app_label, model=None, **hints):
if db in DATABASE_MAPPING.values():
return True
elif app_label in DATABASE_mAPPING:
return False
return None
# 如果我们不想对某个数据库进行迁移,我们只需要加一个判断语句就好了
def allow_migrate(self, db, app_label, model=None, **hints):
if db == '数据库别名':
return False
elif db in DATABASE_MAPPING.values():
return True
elif app_label in DATABASE_mAPPING:
return False
return None
以上是关于django--配置多个数据库的主要内容,如果未能解决你的问题,请参考以下文章
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段