读写分离,顾名思义,我们可以把读和写两个操作分开,减轻数据的访问压力,解决高并发的问题。
那么我们今天就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文件,直接在文件里定义一个数据库路由类,用以区分读写操作。 """数据库读写路由"""
defdb_for_read(self,model,**hints):
"""读"""
return"slave"
defdb_for_write(self,model,**hints):
"""写"""
return"default"
defallow_relation(self,obj1,obj2,**hints):
"""是否运行关联操作"""
returnTrue
最后我们在settings.py中写个路由配置就可以了。 DATABASE_ROUTERS=["app001.db_router.MasterSlaveDBRouter"]
Flask框架实现读写分离
首先自定义Session类,重写get_bind方法,根据self.flushing判断读写操作,选择对应的数据库。 fromflaskimportFlask
fromflask_sqlalchemyimportSQLAlchemy,SignallingSession,get_state
fromsqlalchemyimportorm
classRoutingSession(SignallingSession):
defget_bind(self,mapper=None,clause=None):
state=get_state(self.app)
#判断读写操作
ifself._flushing:#写操作,使用主数据库
print("写入数据")
returnstate.db.get_engine(self.app,bind='master')
else:#读操作,使用从数据库
print('读取数据')
returnstate.db.get_engine(self.app,bind='slave')
自定义SQLAlchemy类,重写create_session方法,并在其内使用自定义的Session类。 classRoutingSQLAlchemy(SQLAlchemy):
defcreate_session(self,options):
returnorm.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读写分离的资料请关注聚米学院其它相关文章!