django 配置多个数据库,并为对应的app指定使用的数据库

3,045 阅读2分钟

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.1 添加数据库别名与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