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 相关文章推荐
python3音乐播放器简单实现代码
Apr 20 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
Sep 28 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
对Python3中bytes和HexStr之间的转换详解
Dec 04 Python
numpy.random.shuffle打乱顺序函数的实现
Sep 10 Python
tensorflow使用range_input_producer多线程读取数据实例
Jan 20 Python
python如何判断IP地址合法性
Apr 05 Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 Python
Python常用断言函数实例汇总
Nov 30 Python
python爬虫之爬取笔趣阁小说
Apr 22 Python
Python中time与datetime模块使用方法详解
Mar 31 Python
Python数据处理的三个实用技巧分享
Apr 01 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/01/28 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
JS window对象的top、parent、opener含义介绍
2013/12/03 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
jquery实现图片预加载
2015/12/25 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
捷科时代的软件测试笔试题
2015/11/09 面试题
优秀的茶餐厅创业计划书
2014/01/03 职场文书
发展部经理职责规定
2014/02/22 职场文书
社区工作者感言
2014/03/02 职场文书
班干部演讲稿
2014/04/24 职场文书
《夕阳真美》教学反思
2014/04/27 职场文书
五好关工委申报材料
2014/05/31 职场文书
高三励志标语
2014/06/05 职场文书
空气的环保标语
2014/06/12 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
党员评议个人总结
2014/10/20 职场文书
七年级生物教学反思
2016/02/20 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis