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文件比较示例分享
Jan 10 Python
python计算书页码的统计数字问题实例
Sep 26 Python
python学习数据结构实例代码
May 11 Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
简单谈谈python中的语句和语法
Aug 10 Python
python中的随机函数random的用法示例
Jan 27 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
Django 用户认证组件使用详解
Jul 23 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
keras中epoch,batch,loss,val_loss用法说明
Jul 02 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 函数学习简单小结
2010/07/08 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
php实现图片上传、剪切功能
2016/05/07 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
使用正则替换变量
2007/05/05 Javascript
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
2014/07/31 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
Python中random模块用法实例分析
2015/05/19 Python
python3使用pyqt5制作一个超简单浏览器的实例
2017/10/19 Python
python自动裁剪图像代码分享
2017/11/25 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
开办饭店创业计划书
2013/12/28 职场文书
财务部绩效考核方案
2014/05/04 职场文书
贷款担保申请书
2014/05/20 职场文书
党员年终个人总结
2015/02/14 职场文书
政协委员个人总结
2015/03/03 职场文书
大学班干部竞选稿
2015/11/20 职场文书
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技