Python实现自定义读写分离代码实例


Posted in Python onNovember 16, 2019

这篇文章主要介绍了Python实现自定义读写分离代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

思路

  • 自定义Session类
    • 重写get_bind方法
    • 根据self._flushing判断读写操作, 选择对应的数据库
  • 自定义SQLAlchemy类
    • 重写create_session, 在其中使用自定义的Session类
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')


class RoutingSQLAlchemy(SQLAlchemy):
  def create_session(self, options):
    return orm.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)

# 用户表 一
class User(db.Model):
  __tablename__ = 't_user'
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(20), unique=True)


@app.route('/')
def index():
  # 增加数据
  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)

不太好,自动选择不能控制

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python File readlines() 使用方法
Mar 19 Python
Python中创建二维数组
Oct 17 Python
python版飞机大战代码分享
Nov 20 Python
Python3实现的回文数判断及罗马数字转整数算法示例
Mar 27 Python
Django组件cookie与session的具体使用
Jun 05 Python
Django实现web端tailf日志文件功能及实例详解
Jul 28 Python
pycharm 安装JPype的教程
Aug 08 Python
python模块导入的方法
Oct 24 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
基于FME使用Python过程图解
May 13 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 Python
python sleep和wait对比总结
Feb 03 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
Nov 16 #Python
基于python实现雪花算法过程详解
Nov 16 #Python
Python大数据之使用lxml库解析html网页文件示例
Nov 16 #Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 #Python
简单了解Pandas缺失值处理方法
Nov 16 #Python
python selenium 执行完毕关闭chromedriver进程示例
Nov 15 #Python
浅谈Django2.0 加xadmin踩的坑
Nov 15 #Python
You might like
PHP开发文件系统实例讲解
2006/10/09 PHP
一个分页的论坛
2006/10/09 PHP
PHP 加密解密内部算法
2010/04/22 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
php线性表的入栈与出栈实例分析
2015/06/12 PHP
php英文单词统计器
2016/06/23 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
node.js中的console用法总结
2014/12/15 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
Python单链表简单实现代码
2016/04/27 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
python中字符串内置函数的用法总结
2018/09/13 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
2015年幼儿园毕业感言
2014/02/12 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
vue选项卡切换的实现案例
2022/04/11 Vue.js
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript