Python web框架(django,flask)实现mysql数据库读写分离的示例
作者:python-讲 发布时间:2024-01-14 15:46:36
标签:python,MySQL,读写分离,django,flask
读写分离,顾名思义,我们可以把读和写两个操作分开,减轻数据的访问压力,解决高并发的问题。
那么我们今天就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


猜你喜欢
- API:statuses/public_timeline 返回最新的200条公共微博,返回结果非完全实时CODE:#!/usr/
- 实现代码# -*- coding: cp936 -*-import re s1 = 'adkkdk's2 = 'ab
- 我们直接先给出输出与预期不同的代码In[28]: a = [1,2,3,4,5,6]In[29]: for i in a: ...: &nb
- Python数据类型分为值类型和引用类型, 下面我们看下它们的区别:值类型:对象本身不允许修改,数值的修改实际上是让变量指向了一个新的对象包
- 它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在
- Mybatis插入mysql报主键重复的问题首先思路是这样的,先去数据表里面去找有没有这个主键的数据(如果有会有返回值,如果没有则返回nul
- 返回pattern字符串在表达式expression里第一次出现的位置,起始值从1开始算。pattern字符串在expression表达式里
- 在SQL Server中进行开发会让你身处险地,并且寻找快速解决方案。我们编辑了前十名关于SQL Server开发的常见问题。对常见的针对表
- 线程和进程1、线程共享创建它的进程的地址空间,进程有自己的地址空间2、线程可以访问进程所有的数据,线程可以相互访问3、线程之间的数据是独立的
- 近期有一个业务需求,多台机器需要同时从Mysql一个表里查询数据并做后续业务逻辑,为了防止多台机器同时拿到一样的数据,每台机器需要在获取时锁
- 如下所示:for line in file.readlines():line=line.strip('\n')来源:http
- 最近因为要使用Python的缘故,安装了python IDE+pycharm,如此安装的原因是因为Pycharn 并不像anaconda一样
- 最近媳妇工作上遇到一个重复性劳动,excel表格查重,重复的标记起来,问我能不能写个程序让它自动查重标记必须安排第一次正儿八经写python
- 1.合并1.1 结构合并将两个结构相同的数据合并1.1.1 concat函数函数配置:concat([dataFrame1, dataFra
- 源码:#路飞骷髅import turtle as t#黄底帽子t.pu()t.goto(0,200)t.circle(-130,-80)t.
- 1、实现目标编写一个命令行通讯录程序,可以添加、查询、删除通讯录好友及电话2、实现方法创建一个类来表示一个人的信息。使用字典存储每个人的对象
- 问题你想在使用范围内执行某个代码片段,并且希望在执行后所有的结果都不可见。解决方案为了理解这个问题,先试试一个简单场景。首先,在全局命名空间
- 什么是探索性数据分析(EDA)?EDA 是数据分析下的一种现象,用于更好地理解数据方面,例如: – 数据的主要
- 本文实例为大家分享了python编写决策树源代码,供大家参考,具体内容如下因为最近实习的需要,所以用python里的sklearn包重新写了
- 太长不看的简洁版本1.x = np.arange(start, end, steps)Values are generated within