Python web框架(django,flask)实现mysql数据库读写分离的示例

 更新时间:2020年11月18日 17:02:57   作者:python-讲  
这篇文章主要介绍了Python web框架(django,flask)实现mysql数据库读写分离的示例,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下

读写分离,顾名思义,我们可以把读和写两个操作分开,减轻数据的访问压力,解决高并发的问题。

那么我们今天就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中读取和加解密PDF文件的详细教程

    Python中读取和加解密PDF文件的详细教程

    在Python中读取和加密PDF文件是一项常见且实用的任务,尤其对于需要处理大量文档自动化处理的场景,本文将详细介绍如何使用Python读取PDF文件内容以及如何使用不同的库来给PDF文件加密,需要的朋友可以参考下
    2024-08-08
  • 用Python定时发送天气邮件

    用Python定时发送天气邮件

    大家好,本篇文章主要讲的是用Python定时发送天气邮件,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 关于numpy中eye和identity的区别详解

    关于numpy中eye和identity的区别详解

    今天小编就为大家分享一篇关于numpy中eye和identity的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 使用python爬取连续降水数据信息实例

    使用python爬取连续降水数据信息实例

    这篇文章主要为大家介绍了使用python提取连续降水数据信息实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • python 获取毫秒级时间问题的解决

    python 获取毫秒级时间问题的解决

    这篇文章主要介绍了python 获取毫秒级时间问题的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 用Python实现web端用户登录和注册功能的教程

    用Python实现web端用户登录和注册功能的教程

    这篇文章主要介绍了用Python实现web端用户登录和注册功能的教程,需要的朋友可以参考下
    2015-04-04
  • numpy.ndarray 交换多维数组(矩阵)的行/列方法

    numpy.ndarray 交换多维数组(矩阵)的行/列方法

    今天小编就为大家分享一篇numpy.ndarray 交换多维数组(矩阵)的行/列方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Python实现不规则图形填充的思路

    Python实现不规则图形填充的思路

    这篇文章主要介绍了Python实现不规则图形填充的思路,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • python3用PyPDF2解析pdf文件,用正则匹配数据方式

    python3用PyPDF2解析pdf文件,用正则匹配数据方式

    这篇文章主要介绍了python3用PyPDF2解析pdf文件,用正则匹配数据方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 关于pygame自定义窗口创建及相关操作指南

    关于pygame自定义窗口创建及相关操作指南

    对于开发一个游戏来说,窗口的显示肯定是前提中的前提,对于pygame来说,只需要一小段代码就可以初始化窗口,下面这篇文章主要给大家介绍了关于pygame自定义窗口创建及相关操作的相关资料,需要的朋友可以参考下
    2022-07-07

最新评论