14 - 模型 - 配置多个数据库

场景: 不同的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']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值