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之变量和参数
Oct 10 Python
Python使用matplotlib绘制动画的方法
May 20 Python
Python去除字符串两端空格的方法
May 21 Python
Python2.7读取PDF文件的方法示例
Jul 13 Python
Python实现修改文件内容的方法分析
Mar 25 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
May 29 Python
浅谈python中对于json写入txt文件的编码问题
Jun 07 Python
python 检查是否为中文字符串的方法
Dec 28 Python
java判断三位数的实例讲解
Jun 10 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
Mar 13 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
文件上传类
2006/10/09 PHP
如何隐藏你的.php文件
2007/01/04 PHP
php 中文处理函数集合
2008/08/27 PHP
UCenter Home二次开发指南
2009/05/28 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
js event事件的传递与冒泡处理
2009/12/06 Javascript
jQuery 核心函数以及jQuery对象
2010/03/23 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
2019/01/30 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
让python同时兼容python2和python3的8个技巧分享
2014/07/11 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
详解Python装饰器
2019/03/25 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
Python操控mysql批量插入数据的实现方法
2020/10/27 Python
HTML5地理定位_动力节点Java学院整理
2017/07/12 HTML / CSS
意大利男装网店:Vrients
2019/05/02 全球购物
社区工作者思想汇报
2014/01/13 职场文书
村捐赠仪式答谢词
2014/01/21 职场文书
毕业晚会主持词
2014/03/24 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
详解盒子端CSS动画性能提升
2021/05/24 HTML / CSS