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牛刀小试密码爆破
Feb 03 Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 Python
基于python指定包的安装路径方法
Oct 27 Python
在Python中输入一个以空格为间隔的数组方法
Nov 13 Python
对python产生随机的二维数组实例详解
Dec 13 Python
Win10环境python3.7安装dlib模块趟过的坑
Aug 01 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 Python
详解Python直接赋值,深拷贝和浅拷贝
Jul 09 Python
python redis存入字典序列化存储教程
Jul 16 Python
python实现自动化群控的步骤
Apr 11 Python
深入浅析Django MTV模式
Sep 04 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 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
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
深入解析php中的foreach函数
2013/08/31 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
Layui选项卡制作历史浏览记录的方法
2019/09/28 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
Python 列表理解及使用方法
2017/10/27 Python
Python错误处理操作示例
2018/07/18 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
Python实现大数据收集至excel的思路详解
2020/01/03 Python
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
servlet面试题
2012/08/20 面试题
中学教师实习自我鉴定
2013/09/28 职场文书
护理专业推荐信
2013/11/07 职场文书
记账会计岗位职责
2014/06/16 职场文书
群众路线个人剖析材料
2014/10/07 职场文书
男方婚礼答谢词
2015/01/20 职场文书
锅炉工岗位职责
2015/02/13 职场文书
西柏坡观后感
2015/06/08 职场文书
追讨欠款律师函
2015/06/24 职场文书
七年级上册生物的课件
2019/08/07 职场文书
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle