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根据区号生成手机号码的方法
Jul 08 Python
python实现红包裂变算法
Feb 16 Python
Python数据类型详解(三)元祖:tuple
May 08 Python
PyQt5每天必学之创建窗口居中效果
Apr 19 Python
python实现连续图文识别
Dec 18 Python
python实现简单flappy bird
Dec 24 Python
python构建指数平滑预测模型示例
Nov 21 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
python实现处理mysql结果输出方式
Apr 09 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
Jun 04 Python
使用AJAX和Django获取数据的方法实例
Oct 25 Python
Python使用protobuf序列化和反序列化的实现
May 19 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
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
PHP发送短信代码分享
2015/08/11 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
js实现登录验证码
2016/12/22 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
微信小程序异步处理详解
2017/11/10 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
2018/07/13 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
Vue.js实现大转盘抽奖总结及实现思路
2019/10/09 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
2015/06/28 Python
Python读取网页内容的方法
2015/07/30 Python
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
Django REST framework 视图和路由详解
2019/07/19 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
行政人事岗位职责
2014/03/17 职场文书
投资申请报告
2015/05/19 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
redis数据结构之压缩列表
2022/03/21 Redis
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏