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

作者:python-讲 时间:2024-01-14 15:46:36 

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

那么我们今天就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的读写分离操作,你学会了吗?

来源:https://segmentfault.com/a/1190000038209925?utm_source=tuicool&utm_medium=referral

标签:python,MySQL,读写分离,django,flask
0
投稿

猜你喜欢

  • pytorch中的自定义数据处理详解

    2023-08-21 09:31:35
  • python标识符的用法及注意事项

    2023-05-02 03:03:04
  • 用python实现前向分词最大匹配算法的示例代码

    2023-12-03 00:18:46
  • Oracle存储过程之数据库中获取数据实例

    2009-03-04 10:57:00
  • Python3实现发送QQ邮件功能(html)

    2023-06-26 16:50:41
  • Mysql语句快速复习教程(全)

    2024-01-26 20:13:37
  • C#调用python文件执行

    2023-11-16 21:35:42
  • python获取本机外网ip的方法

    2022-06-24 01:57:16
  • 简单了解SQL常用删除语句原理区别

    2024-01-14 22:38:57
  • 在程序中压缩sql server2000的数据库备份文件的代码

    2024-01-23 23:01:35
  • 详解用Python为直方图绘制拟合曲线的两种方法

    2021-06-15 23:58:08
  • 各种JavaScript开发工具比较

    2007-10-23 13:29:00
  • pip install urllib2不能安装的解决方法

    2022-05-27 12:25:13
  • python实现websocket的客户端压力测试

    2023-09-30 11:19:57
  • 打印出python 当前全局变量和入口参数的所有属性

    2022-09-01 07:06:51
  • NodeJs Express路由使用流程解析

    2024-05-11 10:16:56
  • Anaconda+vscode+pytorch环境搭建过程详解

    2022-04-06 01:37:19
  • go实现服务优雅关闭的示例

    2023-08-06 09:01:08
  • 【JavaScript实用系列】-- 胖页面载入效果

    2009-10-19 22:48:00
  • innerHTML 的一些问题

    2008-06-17 17:39:00
  • asp之家 网络编程 m.aspxhome.com