vlambda博客
学习文章列表

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中的appDATABASE_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