Python web框架(django,flask)实现mysql数据库读写分离的示例


Posted in Python onNovember 18, 2020

读写分离,顾名思义,我们可以把读和写两个操作分开,减轻数据的访问压力,解决高并发的问题。

那么我们今天就Python两大框架来做这个读写分离的操作。

1.Django框架实现读写分离

Django做读写分离非常的简单,直接在settings.py中把从机加入到数据库的配置文件中就可以了。

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 主服务器的运行ip
'PORT': 3306, # 主服务器的运行port
'USER': 'django_master', # 主服务器的用户名
'PASSWORD': 'django_master', # 主服务器的密码
'NAME': 'djangobase_master' # 数据表名
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': 3307,
'USER': 'django_slave',
'PASSWORD': 'django_slave',
'NAME': 'djangobase_slave'
}
}

在项目的app文件中创建db_route.py文件,直接在文件里定义一个数据库路由类,用以区分读写操作。

    """数据库读写路由"""
    def db_for_read(self, model, **hints):
        """读"""
        return "slave"
    def db_for_write(self, model, **hints):
        """写"""
        return "default"
    def allow_relation(self, obj1, obj2, **hints):
        """是否运行关联操作"""
        return True

最后我们在settings.py中写个路由配置就可以了。

DATABASE_ROUTERS = ["app001.db_router.MasterSlaveDBRouter"]

Flask框架实现读写分离

首先自定义Session类,重写get_bind方法,根据self.flushing判断读写操作,选择对应的数据库。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy, SignallingSession, get_state
from sqlalchemy import orm
  
  
class RoutingSession(SignallingSession):
  def get_bind(self, mapper=None, clause=None):
    state = get_state(self.app)
  
    # 判断读写操作
    if self._flushing: # 写操作 ,使用主数据库
      print("写入数据")
      return state.db.get_engine(self.app, bind='master')
    else: # 读操作, 使用从数据库
      print('读取数据')
      return state.db.get_engine(self.app, bind='slave')

自定义SQLAlchemy类,重写create_session方法,并在其内使用自定义的Session类。

class RoutingSQLAlchemy(SQLAlchemy):
  def create_session(self, options):
    return orm.sessionmaker(class_=RoutingSession, db=self, **options)

接下来创建app实例,配置数据库的监听文件, 然后创建db连接对象就可以了。

app = Flask(__name__)
# 设置数据库的连接地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@192.168.105.134:3306/demo'
# 设置数据库的绑定地址
app.config['SQLALCHEMY_BINDS'] = {
  'master': "mysql://root:mysql@192.168.105.134:3306/demo",
  'slave': "mysql://root:mysql@192.168.105.134:8306/demo"
}
# 设置是否追踪数据库变化  一般不会开启, 影响性能
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 设置是否打印底层执行的SQL语句
app.config['SQLALCHEMY_ECHO'] = False
  
# 创建数据库连接对象
db = RoutingSQLAlchemy(app)

那么这些就是Python的读写分离操作,你学会了吗?

以上就是Python web框架(django,flask)实现mysql数据库读写分离的示例的详细内容,更多关于python MySQL读写分离的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
详解Python函数作用域的LEGB顺序
May 14 Python
python实现ID3决策树算法
Dec 20 Python
运行django项目指定IP和端口的方法
May 14 Python
Python中Proxypool库的安装与配置
Oct 19 Python
对python 命令的-u参数详解
Dec 03 Python
Python SELENIUM上传文件或图片实现过程
Oct 28 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
解决Tensorflow占用GPU显存问题
Feb 03 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
python 如何调用远程接口
Sep 11 Python
Python Django / Flask如何使用Elasticsearch
Apr 19 Python
PyCharm最新激活码PyCharm2020.2.3有效
Nov 18 #Python
python实现图片,视频人脸识别(dlib版)
Nov 18 #Python
python实现图片,视频人脸识别(opencv版)
Nov 18 #Python
最新pycharm安装教程
Nov 18 #Python
如何利用Python写个坦克大战
Nov 18 #Python
python3访问字典里的值实例方法
Nov 18 #Python
让你相见恨晚的十个Python骚操作
Nov 18 #Python
You might like
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
两个Javascript小tip资料
2010/11/23 Javascript
关于query Javascript CSS Selector engine
2013/04/12 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
编写高质量JavaScript代码的基本要点
2016/03/02 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
Node.js中流(stream)的使用方法示例
2017/07/16 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
js实现unicode码字符串与utf8字节数据互转详解
2019/03/21 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
实例讲解React 组件
2020/07/07 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
如何在vue 中使用柱状图 并自修改配置
2021/01/21 Vue.js
Python中的引用和拷贝浅析
2014/11/22 Python
Python实现把xml或xsl转换为html格式
2015/04/08 Python
详解python开发环境搭建
2016/12/16 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
python抽取指定url页面的title方法
2018/05/11 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
小学生打架检讨书
2014/01/26 职场文书
财务会计专业求职信
2014/06/09 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
第一军规观后感
2015/06/12 职场文书
信用卡工资证明范本
2015/06/19 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
股权投资协议书
2016/03/23 职场文书
golang实现浏览器导出excel文件功能
2022/03/25 Golang