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中3种内建数据结构:列表、元组和字典
Nov 30 Python
用Python编写一个简单的FUSE文件系统的教程
Apr 02 Python
Python插件virtualenv搭建虚拟环境
Nov 20 Python
Python模拟随机游走图形效果示例
Feb 06 Python
PyQt5实现拖放功能
Apr 25 Python
Python反射和内置方法重写操作详解
Aug 27 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
Apr 29 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
用python3读取python2的pickle数据方式
Dec 25 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 Python
python​格式化字符串
Apr 20 Python
python多次执行绘制条形图
Apr 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中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
zen cart实现订单中增加paypal中预留电话的方法
2016/07/12 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
从阶乘函数对比Javascript和C#的异同
2012/05/31 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
Python实现的简单发送邮件脚本分享
2014/11/07 Python
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
毕业生教师求职信
2013/10/20 职场文书
毕业研究生的自我鉴定
2013/11/30 职场文书
结婚纪念日感言
2015/08/01 职场文书
安全生产感想
2015/08/07 职场文书