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中的mock库对Python代码进行模拟测试
Apr 16 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
Apr 25 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
Python从文件中读取数据的方法讲解
Feb 14 Python
Pandas中resample方法详解
Jul 02 Python
django 连接数据库 sqlite的例子
Aug 14 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
简单了解Python write writelines区别
Feb 27 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
python 实现端口扫描工具
Dec 18 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
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
dess中一个简单的多路委托的实现
2010/07/20 Javascript
aspx中利用js实现确认删除代码
2010/07/22 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
鼠标拖拽移动子窗体的JS实现
2014/02/25 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
node实现定时发送邮件的示例代码
2017/08/26 Javascript
Vue使用mixins实现压缩图片代码
2018/03/14 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
跟老齐学Python之类的细节
2014/10/13 Python
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
给客户的道歉信
2014/01/13 职场文书
《掌声》教学反思
2014/02/23 职场文书
双拥工作宣传标语
2014/06/26 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
雷锋观后感
2015/06/10 职场文书
汽车销售员工作总结
2015/08/12 职场文书
详解CSS3浏览器兼容
2022/12/24 HTML / CSS