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中bisect模块用法实例
Sep 25 Python
使用Python的Bottle框架写一个简单的服务接口的示例
Aug 25 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
python实现本地图片转存并重命名的示例代码
Oct 27 Python
python创建n行m列数组示例
Dec 02 Python
解决Python pip 自动更新升级失败的问题
Feb 21 Python
django为Form生成的label标签添加class方式
May 20 Python
python递归函数用法详解
Oct 26 Python
Python中rapidjson参数校验实现
Jul 25 Python
Python中的嵌套循环详情
Mar 23 Python
详解OpenCV曝光融合
Apr 29 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出错界面
2006/10/09 PHP
杏林同学录(七)
2006/10/09 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
PHP PDOStatement::fetchObject讲解
2019/02/01 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
PHP中非常有用却鲜有人知的函数集锦
2019/08/17 PHP
jQuery 加上最后自己的验证
2009/11/04 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
JavaScript中的闭包
2016/02/24 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
python网络编程之读取网站根目录实例
2014/09/30 Python
Python解析nginx日志文件
2015/05/11 Python
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
python如何实现excel数据添加到mongodb
2015/07/30 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
Django中ORM找出内容不为空的数据实例
2020/05/20 Python
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
升职演讲稿范文
2014/05/23 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
校运会通讯稿
2015/07/18 职场文书
职工宿舍管理制度
2015/08/05 职场文书