Python实现自定义读写分离代码实例
这篇文章主要介绍了Python实现自定义读写分离代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
思路
- 自定义Session类
- 重写get_bind方法
- 根据self._flushing判断读写操作,选择对应的数据库
- 自定义SQLAlchemy类
- 重写create_session,在其中使用自定义的Session类
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')
classRoutingSQLAlchemy(SQLAlchemy):
defcreate_session(self,options):
returnorm.sessionmaker(class_=RoutingSession,db=self,**options)
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)
#用户表一
classUser(db.Model):
__tablename__='t_user'
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(20),unique=True)
@app.route('/')
defindex():
#增加数据
user1=User(name='zs')
db.session.add(user1)
db.session.commit()
#查询数据
users=User.query.all()
print(users)
return"index"
if__name__=='__main__':
#删除所有继承自db.Model的表
db.drop_all()
#创建所有继承自db.Model的表
db.create_all()
app.run(debug=True)
不太好,自动选择不能控制
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。