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制作Windows系统服务
Mar 25 Python
Python贪心算法实例小结
Apr 22 Python
python语音识别实践之百度语音API
Aug 30 Python
Tensorflow分类器项目自定义数据读入的实现
Feb 05 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
使用python实现简单五子棋游戏
Jun 18 Python
python使用装饰器作日志处理的方法
Jul 11 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 Python
python3通过qq邮箱发送邮件以及附件
May 20 Python
scrapy处理python爬虫调度详解
Nov 23 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
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
jquery表单验证插件formValidator使用方法
2016/04/01 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
javascript事件冒泡简单示例
2016/06/20 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
JavaScript实现世界各地时间显示
2020/09/07 Javascript
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
PHP webshell检查工具 python实现代码
2009/09/15 Python
python爬虫爬取网页表格数据
2018/03/07 Python
python批量赋值操作实例
2018/10/22 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
什么是Python中的匿名函数
2020/06/02 Python
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
师范毕业生自荐信
2013/10/17 职场文书
总经理司机职责
2014/02/02 职场文书
幼儿园教师节活动方案
2014/02/02 职场文书
高中家长寄语
2014/04/02 职场文书
三八妇女节活动总结
2014/05/04 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
通讯稿格式及范文
2015/07/22 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
交通安全教育心得体会
2016/01/15 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书