Django配置多个数据库(两种方法)


两种方法均为:不同APP使用不同数据库

第一种方法(使用默认数据库配置)

准备一个可以跑的通的Django项目

  1. 【settings.py操作】打开项目文件夹下的主文件夹中的settings.py文件,如下图,我的默认数据库设置的是阿里云远程数据库,然后新增一个本地数据库取名“db1
    在这里插入图片描述

  2. 【settings.py操作】添加数据库路由参数

    DATABASES_APPS_MAPPING = {
        'author': 'default',  # 数据库与APP应用一一对应
        'zydata': 'db1',  # 数据库与APP应用一一对应
    }
    

    参数名需要和APP应用名一一对应,如下图:
    在这里插入图片描述

  3. 【在主Module文件夹中添加路由文件操作】编写数据库路由文件database_app_router.py(此文件为功能文件,直接复制粘贴即可,详细看第二种方法)

    from django.conf import settings
    
    class DatabaseAppsRouter(object):
    def db_for_read(self, model, **hints):
        app_label = model._meta.app_label
        if app_label in settings.DATABASES_APPS_MAPPING:
            res = settings.DATABASES_APPS_MAPPING[app_label]
            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
    
  4. 【settings.py操作】添加指向数据库路由文件的路由变量

    # 配置数据库的路由,里面的参数以.为分割,分别是Module文件夹名.数据库路由配置文件.数据库路由配置文件中的方法
    DATABASE_ROUTERS = ['notedrf.database_app_router.DatabaseAppsRouter']
    
    
  5. 如果还没有MySQL数据库表的话,以上配置结束就可以在各个APP中编辑models.py中的数据库表结构了。编辑完成后同步数据库,如下:

    python manage.py makemigrations
    python manage.py migrate --database=db1
    python manage.py migrate

  6. 如果已经存在MySQL数据库表的话,那么只需要对mysql数据库表来反向映射结构到models.py中即可。例如针对已存在的本地数据库db1进行反向映射,在Terminal终端中输入以下命令,将会得到反向映射后的代码,如下:

    python manage.py inspectdb --database db1

    在这里插入图片描述
    将代码复制粘贴到对应APP应用下的models.py中即可

  7. 以上过程完成后,就可以在对应APP应用下的视图中引用models模块了

第二种方法(不使用默认数据库配置)

第二种方法和第一种大致类似,只不过没有使用默认数据库选项和修改了数据库路由文件

  1. 【settings.py数据库配置】本次没有使用默认数据库配置,但是default不可少,需要设置为空,如下图:
    在这里插入图片描述

  2. 【settings.py操作】添加指向数据库路由文件的路由变量,如上图最后一行

    #配置数据库的路由
    DATABASE_ROUTERS = [‘notedrf.db_setting_router.DatabaseRouter’, ]

  3. 【在主Module文件夹中添加路由文件操作】编写数据库路由文件db_setting_router.py

    class DatabaseRouter(object):
        # 如果决定把哪个APP下创建的表放到db0中,就把APP名字写到里面
        db_author_apps = (
            "author",
        )
    
        def db_for_read(self, model, **hints):
    
            if model._meta.app_label in self.db_author_apps:
                return 'db0'
            if model._meta.app_label in ["zydata",]:  # 需要把哪个APP放到db1中,就把哪个APP名字写在列表中
                return 'db1'
            return None
    
    
        def db_for_write(self, model, **hints):
    
            if model._meta.app_label in self.db_author_apps:
                return 'db0'
            if model._meta.app_label in ["zydata",]:
                return 'db1'
            return None
    
        def allow_migrate(self, db, app_label, model=None, **hints):
    
            if app_label in self.db_author_apps:
                return db == 'db0'
            if app_label in ["zydata"]:
                return db == 'db1'
            return None
    
    
  4. 剩下的编辑数据库、同步数据库即可,具体见第一种方法第5步

  5. 以上过程完成后,就可以在对应APP应用下的视图中引用models模块了

建议

最好使用第一种方法,本人在使用第二种方法的时候有时会报错:

settings.DATABASES is improperly configured. Please supply the ENGINE
value. Check settings documentation for more details.

解决方法还比较麻烦,猜测可能是因为没有使用默认数据库配置变量default,改天再试一下“在第二种方法中使用default

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值