Django 内设置读写分离

1.启动Mysql一主一从服务
Mysql的一主多从下,只有主库才能进行读写,从库只能读不能写
2.在setting.py,中首先配置多个数据库

DATABASES = {
    #默认数据库,配置多个mysql数据也是ok的,混用数据库也是ok的
    'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'crm',
            'USER': 'root',
            'PASSWORD': 'xxxx',
            'HOST': '127.0.0.1',
            'PORT': '3306', #(主数据库,所在端口)
        }

    #配置的第二个数据库,注意数据库名字不能相同
   'slave': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'crm',
              'USER': 'root',
              'PASSWORD': 'xxxx',
              'HOST': '127.0.0.1',
              'PORT': '3307', #(从数据库,所在端口)
          }
}

3. 进行数据库迁移

python manage.py makemigrations
python manage.py migrate

在migrations文件夹下生成记录,并在迁移前检查是否有问题,默认值检查defualt数据库,但是可以在后面的数据库路由类(Router)中通过allow_migrate()方法来指定是否检查其它的数据库。
其实第二步迁移默认有参数python manage.py migrate –database default ,在默认数据库上创建表。
因为我采用的是Mysql的一主多从,迁移时候只需要迁移至主数据库就行了,也就是默认的default数据库,从数据库会会自动根据主数据库进行备份
4.怎么实现读写分离
方法一:手动

def dbtest(request):
    # 向default数据库中写入数据
    # models.Class.objects.using('default').create(name='xx')

    # 从slave中读取数据
    data = models.Class.objects.using('slave').all()
    # 更新时
    for i in data:
        i.name = 'xxxxxx'
        i.save(using='default') #更新时指定数据库
    return render(request,'dbtest.html',{'data':data})

方法二:自动
a.在应用文件夹中创建一个py文件(比如我写在app01目录下),名字随意,比如叫做router.py文件,写上下面的内容

class Router:
    # 读操作用default库,就return这个库名字符串
    def db_for_read(self,model,**kwargs): # 方法名必须叫这个,不可更改
        return 'default'

    def db_for_write(self,model,**kwargs):# 方法名必须叫这个,不可更改
        return 'db2'

b.然后在 settings.py 配置文件中做下面的配置

#写上面这个类的路径,我的是在app01应用文件夹下面的router.py文件中了
DATABASE_ROUTERS = ['app01.router.Router',]

c.那么在逻辑的views.py文件中写的时候,就不需要using指定数据库了

def dbtest(request):
    # 向default数据库中写入数据
    # models.Class.objects.create(name='xx')

    # 从slave中读取数据
    data = models.Class.objects.all()
    # 更新时
    for i in data:
        i.name = 'xxxxxx'
        i.save() #更新时指定数据库
    return render(request,'dbtest.html',{'data':data})

c.如果有多个应用,Mysql也有多个从从复制,也可以根据不同的应用来选择不同的库进行读取

import random
class Router:
    # 读操作用default库,就return这个库名字符串
    def db_for_read(self,model,**kwargs):
        print(model)
        print(dir(model))# 其中有个_meta属性很有用
        a = model._meta.app_label #获取当前model对象所在的应用名称    
        m = model._meta.model_name  获取当前操作的model对象的表名,也可以根据表名来进行多数据库读的分配
        # 可以根据应用选择不用的库来进行读取
        if a == 'app01':
            return 'slave01'
        elif a == 'app02':
            return 'db2'
        return 'slave02' # 假定mysql 设置了不止一个从文件

    def db_for_write(self,model,**kwargs):

参考:
永远的超哥
不知名的好人

Original: https://www.cnblogs.com/GouHuang/p/16126141.html
Author: GouHuang
Title: Django 内设置读写分离

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/563821/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • seata部署指南(v1.6.1)

    Seata 搭建 db模式 版本 V1.6.1 * 一、 简介 二、下载 三、建表(仅db) 四、配置 seata server 参数 – 4.1、V1.4.2之前方式…

    Python 2023年11月6日
    048
  • Spark中配置参数的优化

    num-executors 参数说明: 参数用于设置Spark作业总共要用多少个Executor进程来执行。Driver在向YARN集群管理器申请资源时,YARN集群管理器会尽可能…

    Python 2023年6月3日
    083
  • Django连接mysql数据库步骤非常详细

    一.修改数据库连接 以上内容是创建django项目的时候是自动创建的。这个是告诉你,django默认连接sqllite。 ENGINE:是指连接数据库驱动的名称, NAME是指要连…

    Python 2023年8月3日
    036
  • 自动化脚本如何切换环境?Pytest这些功能你必须要掌握

    测试人员每天都跟不同的环境打交道,比如线上环境,测试环境,预上线环境等等,那么作为自动化测试人员写的代码,我们也要具备能自由切换环境的能力,那么今天小编就给大家聊一下,如何能让我们…

    Python 2023年9月14日
    048
  • Python 各种数据保存与读取方法——numpy,dict,dataframe等等

    往往在做机器学习或者深度学习的时候,数据预处理部分需要大量的时间,如果每次debug都重新预处理数据,这样速度非常慢。我有一个embedding的数据预处理过程,重新跑一次要两分钟…

    Python 2023年8月26日
    050
  • 这些编程语言你需要了解一下

    2022 年最受欢迎的语言 1、Python Python 位居 2022 年最受欢迎的语言榜首,并且鉴于多种原因成为最适合学习的编程语言之一。Python 是一种通用的服务器端编…

    Python 2023年8月1日
    030
  • 7.15 LeetCode刷题记录(滑动窗口 中等x1)

    1、无重复字符串的最长子串(滑动窗口) 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1:输入: s = “abcabcbb&#8221…

    Python 2023年6月11日
    080
  • python合并多个excel

    @ 前言 代码编写 – 1.导包 2.定义位置和表头 3.获取要合并的所有exce表格 4.打开Exce文件 5.获取exce文件下的所有sheet 6.获取sheet…

    Python 2023年10月20日
    028
  • 适合编程初学者的开源博客系统(Vue3+Element Plus版)

    目标 为编程初学者打造入门学习项目,使用各种主流编程语言来实现。让想学编程的,一个都不落下。 上述基本涵盖了当前编程开发所有主流语言。左侧为前端版本:安卓、iOS、鸿蒙、Flutt…

    Python 2023年9月30日
    054
  • Django配置redis缓存

    Django配置redis缓存 (1)首先安装django-redis pip install django-redis (2)在settings中配置如下所示: 改配置仅为示例,…

    Python 2023年6月11日
    0138
  • pip安装之权限问题

    1、如果python安装在C盘的话,那么在通过pip安装模块时需要以管理员形式打开命令窗口去执行pip 安装命令 操作方法:按win+X 键,选择windows powershel…

    Python 2023年6月11日
    094
  • 用python开发一个益智游戏,没事就锻炼锻炼自己的方向感

    兄弟们,爬行动物爬得太多了,对健康不好,还要考虑劳逸结合,偶尔换换口味。 [En] Brothers, reptiles crawl too much, it is not goo…

    Python 2023年5月24日
    059
  • cython和python分别是什么?区别有哪些?

    推荐文章 很多小伙伴都发现了,用户自主「申请上首页」的按钮取消了,那博主们写的文章还有上首页曝光的机会吗?我们的回答是”当然有!!!”虽然我们取消了上首页申…

    Python 2023年5月25日
    0108
  • 第十四届蓝桥杯模拟赛第一期试题【Java解析】

    目录 A 二进制位数 问题描述 答案提交 参考答案 解析 B 晨跑 问题描述 答案提交 参考答案 解析 C 调和级数 问题描述 答案提交 参考答案 解析 D 山谷 问题描述 答案提…

    Python 2023年10月7日
    061
  • pytest学习总结2.4及2.5 – 参数化和mark标记

    2.4 mark 标记被测函数 以下是mark的一些内置结构的标记物: usefixtures – 在测试功能或类上使用固定装置 filterwarnings &#82…

    Python 2023年9月11日
    042
  • Flask介绍

    Flask的核心在Werkaeug(路由模块),Jinja2模板引擎 ​ 类比Django:路由、模板、ORM ​ Flask要完成功能,依赖于丰富的插件(扩展模式) 常见问题 D…

    Python 2023年8月11日
    043
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球