python SQLAlchemy 中的Engine详解


Posted in Python onJuly 04, 2019

先看这张图,这是从官方网站扒下来的。

python SQLAlchemy 中的Engine详解

Engine 翻译过来就是引擎的意思,汽车通过引擎来驱动,而 SQLAlchemy 是通过 Engine 来驱动,Engine 维护了一个连接池(Pool)对象和方言(Dialect)。方言简单而言就是你连的到底是 MySQL 还是 Oracle 或者 PostgreSQL 还是其它数据库,关于方言(Dialect)的介绍在另外一篇文章有介绍,可参考数据库方言dialect。

连接池很重要,因为每次发送sql查询的时候都需要先建立连接,如果程序启动的时候事先就初始化一批连接放在连接池,每次用完后又放回连接池给其它请求使用,就能大大提高查询的效率。

Engine 初始化

Engine 的初始化非常简单,通过工厂函数 create_engine 就可以创建。

from sqlalchemy import create_engine

engine = create_engine('mysql://user:password@localhost:3306/test?charset=utf8mb4')

构建好 Engine 对象的同时,连接池和Dialect也创建好了,但是这时候并不会立马与数据库建立真正的连接,只有你调用 Engine.connect() 或者 Engine.execute(sql) 执行SQL请求的时候,才会建立真正的连接。因此 Engine 和 Pool 的行为称之为延迟初始化,用现在流行的话来说就是延迟满足感,等真正要派上用场的时候才去建立连接。

需要注意的是,创建引擎时,如果数据库的密码含有特殊字符,需要先编码处理

>>> import urllib.parse
>>> urllib.parse.quote_plus("kx%jj5/g")
'kx%25jj5%2Fg'

其它数据库方言初始化 engine 的方式可参考官方文档

create_engine 还有很多可选参数,这里介绍几个重要的参数。

engine = create_engine('mysql://user:password@localhost:3306/test?charset=utf8mb4',
   echo=False
   pool_size=100,
   pool_recycle=3600,
   pool_pre_ping=True)

echo :为 True 时候会把sql语句打印出来,当然,你可以通过配置logger来控制输出,这里不做讨论。

pool_size: 是连接池的大小,默认为5个,0表示连接数无限制

pool_recycle: MySQL 默认情况下如果一个连接8小时内容没有任何动作(查询请求)就会自动断开链接,出现 MySQL has gone away的错误。设置了 pool_recycle 后 SQLAlchemy 就会在指定时间内回收连接。如果设置为3600 就表示 1小时后该连接会被自动回收。

pool_pre_ping : 这是1.2新增的参数,如果值为True,那么每次从连接池中拿连接的时候,都会向数据库发送一个类似 select 1 的测试查询语句来判断服务器是否正常运行。当该连接出现 disconnect 的情况时,该连接连同pool中的其它连接都会被回收。

参考链接:

  • https://docs.sqlalchemy.org/en/14/core/engines.html#database-urls
  • https://stackoverflow.com/questions/34322471/sqlalchemy-engine-connection-and-session-difference
  • https://docs.sqlalchemy.org/en/13/core/pooling.html#dealing-with-disconnects

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

Python 相关文章推荐
python学习之编写查询ip程序
Feb 27 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
Python+tkinter模拟“记住我”自动登录实例代码
Jan 16 Python
python 获取字符串MD5值方法
May 29 Python
python实现电脑自动关机
Jun 20 Python
python处理数据,存进hive表的方法
Jul 04 Python
使用Python实现一个栈判断括号是否平衡
Aug 23 Python
python实现随机漫步方法和原理
Jun 10 Python
简单了解Python matplotlib线的属性
Jun 29 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
使用pytorch和torchtext进行文本分类的实例
Jan 08 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 #Python
pybind11在Windows下的使用教程
Jul 04 #Python
Pandas_cum累积计算和rolling滚动计算的用法详解
Jul 04 #Python
Pycharm简单使用教程(入门小结)
Jul 04 #Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 #Python
Python读取xlsx文件的实现方法
Jul 04 #Python
使用python进行广告点击率的预测的实现
Jul 04 #Python
You might like
全国FM电台频率大全 - 27 陕西省
2020/03/11 无线电
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
PHP设计模式之观察者模式定义与用法分析
2019/04/04 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
vue-router 2.0 跳转之router.push()用法说明
2020/08/12 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
Python3实现从指定路径查找文件的方法
2015/05/22 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
Python异常处理知识点总结
2019/02/18 Python
flask实现验证码并验证功能
2019/12/05 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
小学毕业感言300字
2014/02/19 职场文书
毕业生如何写自我鉴定
2014/03/15 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS
分享Python异步爬取知乎热榜
2022/04/12 Python