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系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
python 添加用户设置密码并发邮件给root用户
Jul 25 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
python3中zip()函数使用详解
Jun 29 Python
pygame实现贪吃蛇游戏(上)
Oct 29 Python
python常用排序算法的实现代码
Nov 08 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
Python解析多帧dicom数据详解
Jan 13 Python
python Django 反向访问器的外键冲突解决
May 20 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 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 常用类整理
2009/12/23 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
php日期操作技巧小结
2016/06/25 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
2016/11/25 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
angularJS自定义directive之带参方法传递详解
2018/10/09 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
使用Python编写Linux系统守护进程实例
2015/02/03 Python
python实现基本进制转换的方法
2015/07/11 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
python中pivot()函数基础知识点
2021/01/03 Python
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
通信工程毕业生求职信
2013/11/16 职场文书
仓库门卫岗位职责
2013/12/22 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
司机岗位职责
2015/02/04 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang