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安装oracle扩展及数据库连接方法
Feb 21 Python
在Python中执行系统命令的方法示例详解
Sep 14 Python
Python实现的视频播放器功能完整示例
Feb 01 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
python logging重复记录日志问题的解决方法
Jul 12 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
Mar 08 Python
python中shell执行知识点
May 06 Python
Python中常见的数制转换有哪些
May 27 Python
如何在pycharm中安装第三方包
Oct 27 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
Python深度学习之Pytorch初步使用
May 20 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
使用PHP的日期与时间函数技巧
2008/04/24 PHP
php商品对比功能代码分享
2015/09/24 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
点图片上一页下一页翻页效果
2008/07/09 Javascript
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
Javascript复制实例详解
2016/01/28 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
VUE实现强制渲染,强制更新
2019/10/29 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
js、jquery实现列表模糊搜索功能过程解析
2020/03/27 jQuery
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
Python的SQLAlchemy框架使用入门
2015/04/29 Python
Windows下安装Scrapy
2018/10/17 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
巴西网上药房:onofre
2016/11/21 全球购物
人事经理岗位职责范本
2014/08/04 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
化妆品促销活动总结
2015/05/07 职场文书
追悼词范文大全
2015/06/23 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL