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发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
用Python实现服务器中只重载被修改的进程的方法
Apr 30 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
用Python实现大文本文件切割的方法
Jan 12 Python
基于python3实现倒叙字符串
Feb 18 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
Mar 17 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
解决python运行启动报错问题
Jun 01 Python
Django全局启用登陆验证login_required的方法
Jun 02 Python
Python 如何定义匿名或内联函数
Aug 01 Python
python 定义函数 返回值只取其中一个的实现
May 21 Python
Python装饰器的练习题
Nov 23 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
ajax实现无刷新分页(php)
2010/07/18 PHP
PHP中extract()函数的妙用分析
2012/07/11 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
PHP数组函数知识汇总
2016/05/12 PHP
php实现的双色球算法示例
2017/06/20 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
Python如何实现守护进程的方法示例
2017/02/08 Python
答题辅助python代码实现
2018/01/16 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
Python装饰器用法与知识点小结
2020/03/09 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
2020/12/04 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书
Python中三种花式打印的示例详解
2022/03/19 Python