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中将字典转换成其json字符串
Jul 16 Python
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
Python使用gensim计算文档相似性
Apr 10 Python
python3中的md5加密实例
May 29 Python
Python 删除连续出现的指定字符的实例
Jun 29 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
Feb 17 Python
Python读取xlsx文件的实现方法
Jul 04 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
PyCharm第一次安装及使用教程
Jan 08 Python
Keras实现支持masking的Flatten层代码
Jun 16 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
Python中22个万用公式的小结
Jul 21 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脚本的10个技巧(8)
2006/10/09 PHP
PHP字符串的编码问题的详细介绍
2013/04/27 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
Laravel实现搜索的时候分页并携带参数
2019/10/15 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
Extjs中使用extend(js继承) 的代码
2012/03/15 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
微信小程序 选项卡的简单实例
2017/05/24 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
python的id()函数介绍
2013/02/10 Python
详解Python3.1版本带来的核心变化
2015/04/07 Python
Python实现动态图解析、合成与倒放
2018/01/18 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
项目投资意向书
2014/04/01 职场文书
个人简历自我评价怎么写
2015/03/10 职场文书
讲座新闻稿
2015/07/18 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技
Spring Boot 实现 WebSocket
2022/04/30 Java/Android