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获取指定网页上所有超链接的方法
Apr 04 Python
Python环境下搭建属于自己的pip源的教程
May 05 Python
Python编程中装饰器的使用示例解析
Jun 20 Python
Python中列表list以及list与数组array的相互转换实现方法
Sep 22 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
Python中的pack和unpack的使用
Mar 12 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
python 使用plt画图,去除图片四周的白边方法
Jul 09 Python
Python正则表达式急速入门(小结)
Dec 16 Python
Python BeautifulReport可视化报告代码实例
Apr 13 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
python开根号实例讲解
Aug 30 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
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
PHP获取MySql新增记录ID值的3种方法
2014/06/24 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
JavaScript 验证浏览器是否支持javascript的方法小结
2009/05/17 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
python安装与使用redis的方法
2016/04/19 Python
python编程实现归并排序
2017/04/14 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
详解Python 循环嵌套
2020/07/09 Python
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
家长给学校的建议书
2014/05/15 职场文书
办公用品质量保证书
2015/05/11 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
教你一步步实现一个简易promise
2021/11/02 Javascript
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android