前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Web开发 | Django】数据库分流之道:探索Django多数据库路由最佳实践

【Web开发 | Django】数据库分流之道:探索Django多数据库路由最佳实践

作者头像
计算机魔术师
发布2023-10-18 14:37:41
3250
发布2023-10-18 14:37:41
举报
文章被收录于专栏:计算机魔术师

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

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

背景

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

在这里插入图片描述
在这里插入图片描述

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

配置多数据源settings

  1. 创建应用用于存放管理
代码语言:javascript
复制
startapp company
  1. settings添加多数据库配置
代码语言:javascript
复制
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. 根据数据库生成对应model

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

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
python manage.py inspectdb --database=employee [表1 表2...]  > company/models.py
在这里插入图片描述
在这里插入图片描述
  1. 创建router数据库路由类并添加到settings

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

创建路由类

路由必须要有四个函数

  1. db_for_read 读
  2. db_for_write 写
  3. allow_relation 数据库之间链接关系
  4. allow_migrate 是否允许迁移数据
代码语言:javascript
复制
"""
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. setting添加配置
代码语言:javascript
复制
"""多数据库路由"""
DATABASE_ROUTERS = ['settings.router.DatabaseRouter']
#DATABASE_APPS_MAPPING = {
#    'employee': 'employee',
#}

后台注册模型,运行服务器,查看后台,设置成功

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 配置多数据源settings
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档