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中字符串的常见操作技巧总结
Jul 28 Python
python对配置文件.ini进行增删改查操作的方法示例
Jul 28 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
Jun 22 Python
python实现画一颗树和一片森林
Jun 25 Python
学生信息管理系统python版
Oct 17 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
Dec 17 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
PyCharm 设置SciView工具窗口的方法
Jan 15 Python
Python实现的列表排序、反转操作示例
Mar 13 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
Python netmiko模块的使用
Feb 14 Python
python中tab键是什么意思
Jun 18 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
关于crontab的使用详解
2013/06/24 PHP
php下拉选项的批量操作的实现代码
2013/10/14 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
PHP自带方法验证邮箱是否存在
2016/02/01 PHP
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
几种tab切换详解
2017/02/03 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
angularjs实现猜数字大小功能
2020/05/20 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
es6函数之尾调用优化实例分析
2020/04/25 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
python SVD压缩图像的实现代码
2019/11/05 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
护士自我鉴定
2013/10/23 职场文书
五年级英语教学反思
2014/01/31 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
2014年创卫工作总结
2014/11/24 职场文书
护士辞职信怎么写
2015/02/27 职场文书
公司禁烟通知
2015/04/23 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js