码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Web开发 | Django】数据库分流之道:探索Django多数据库路由最佳实践


    在这里插入图片描述

    🤵‍♂️ 个人主页: @AI_magician
    📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
    👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍
    🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)

    该文章收录专栏
    ✨—【Django | 项目开发】从入门到上线 专栏—✨

    在这里插入图片描述

    该文章收录专栏
    ✨—Django从(图文并茂轻松上手教程)专栏—✨!!

    🎏内容:
    ✨【Djang | 增删改查】学生系统案例✨
    ✨【Django | 项目搭建】快速搭建自己的项目✨
    ✨【Django | allauth】登录_注册_邮箱验证_密码邮箱重置✨
    ✨【Django | allauth】useprofile 用户模型扩展✨
    ✨【Django | allauth】重写allauth重置密码方法✨
    ✨【Django | 开发】面试招聘信息网站(快速搭建核心需求)✨
    ✨【Django | 开发】面试招聘信息网站(增加csv,excel导出&日志管理功能)✨
    ✨【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)✨
    ✨【Django | 开发】面试招聘信息网站(划分面试官权限&集成钉钉消息)✨
    ✨【Django | 开发】面试招聘信息网站(用户登录注册&投在线递简历)✨

    背景

    在实际上,有许多遗留的系统,但此时我们仍需要管理其数据,并在不更改其数据表结构的情况下,此时我们可以使用多数据库路由实现

    在这里插入图片描述

    假如我们现在有一个mysql的数据库信息,我们需要将其纳入管理

    配置多数据源settings

    1. 创建应用用于存放管理
    startapp company
    
    • 1
    1. settings添加多数据库配置
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'django_recruitment',
            'PASSWORD': '123456',
            'PORT': '3306',
            'USER': 'root',
            'HOST': 'db',
            # 'HOST': '127.0.0.1',
            'OPTIONS': {'charset': 'utf8mb4'},
        },  # todo 注意:这里使用的是db别名,docker会自动解析成ip  部署!
        'employee': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'employee',
            'PASSWORD': '123456',
            'PORT': '3306',
            'USER': 'root',
            # 'HOST': '127.0.0.1',
            'HOST': 'db',
            'OPTIONS': {'charset': 'utf8mb4'},
        },
        # 'sqlite': {
        #     'ENGINE': 'django.db.backends.sqlite3',
        #     'NAME': BASE_DIR / 'db.sqlite3',
        # }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    1. 根据数据库生成对应model

    但需要注意是的要为数据库设置一个ID主键不然会报错(见文章,显然这里的id就是django默认主键,还要再app.py中设置对应默认主键字段),或者修改django中的应用,主键配置。在这里插入图片描述

    python manage.py inspectdb --database=employee [表1 表2...]  > company/models.py
    
    • 1

    在这里插入图片描述

    1. 创建router数据库路由类并添加到settings

    我们既然是多数据库路由,那么在对表进行增删改查就需要进行区分,路由类router则充当了这个角色

    创建路由类

    路由必须要有四个函数

    1. db_for_read 读
    2. db_for_write 写
    3. allow_relation 数据库之间链接关系
    4. allow_migrate 是否允许迁移数据
    """
    setting/routers.py
    一个数据库路由是一个拥有4个方法的类
    """
    
    
    class DatabaseRouter:
        #  设置 次数据库的应用 set
        router_app_labels = {'employee'}
    
        # 对模型操作
        def db_for_read(self, model, **hints):
            if model._meta.app_label in self.router_app_labels:
                return 'employee'
            return 'default'  # 返回数据库路由
    
        def db_for_write(self, model, **hints):
            if model._meta.app_label in self.router_app_labels:
                return 'employee'
            return 'default'
    
        # 不允许数据库之间链接关系
        def allow_relation(self, obj1, obj2, **hints):
            return None
    
        # 允许迁移
        def allow_migrate(self, db, app_label, model_name=None, **hints):
            if app_label in self.router_app_labels:
                """
                遗留数据库不允许迁移
                """
                return False
            return True
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    1. 在setting添加配置
    """多数据库路由"""
    DATABASE_ROUTERS = ['settings.router.DatabaseRouter']
    #DATABASE_APPS_MAPPING = {
    #    'employee': 'employee',
    #}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    后台注册模型,运行服务器,查看后台,设置成功
    在这里插入图片描述

    问题:
    由于之前多次配置admin,导致了重定向问题, 这个时候我们只要刷新重启一下就行(清楚浏览器缓存)
    在这里插入图片描述

    参考文献:
    Django中如何实现数据库路由?
    多数据库路由(重点)

    在这里插入图片描述
    🤞到这里,如果还有什么疑问🤞
    🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
    🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳

  • 相关阅读:
    flink理论干货笔记(7)及spark论文相关思考
    开设自己的网站系类01购买服务器
    Mybatis基础支持层-反射模块:ObjectFactory/Property工具类
    精心整理 170 道 Python 面试题
    Linux 文本处理命令 - grep
    C语言整理(待更新)
    JSP第二篇 -----JSP浅聊EL表达式第二篇:EL表达式中的运算符
    入门力扣自学笔记149 C++ (题目编号1608)
    好心情:双相情感障碍会影响记忆力吗
    1230天,百度再见!!!
  • 原文地址:https://blog.csdn.net/weixin_66526635/article/details/126013201
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号