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