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 相关文章推荐
Ubuntu下创建虚拟独立的Python环境全过程
Feb 10 Python
python与C互相调用的方法详解
Jul 14 Python
Pycharm编辑器技巧之自动导入模块详解
Jul 18 Python
python3 破解 geetest(极验)的滑块验证码功能
Feb 24 Python
Python处理菜单消息操作示例【基于win32ui模块】
May 09 Python
利用Python如何实现数据驱动的接口自动化测试
May 11 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
AUC计算方法与Python实现代码
Feb 28 Python
Python中三维坐标空间绘制的实现
Sep 22 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 Python
python 详解turtle画爱心代码
Feb 15 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
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
基于vue、react实现倒计时效果
2019/08/26 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
布同自制Python函数帮助查询小工具
2011/03/13 Python
python使用cookielib库示例分享
2014/03/03 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python3实现从指定路径查找文件的方法
2015/05/22 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
通过实例解析Python文件操作实现步骤
2020/09/21 Python
制定岗位职责的原则
2013/11/08 职场文书
行政部主管岗位职责
2013/12/28 职场文书
幼儿园小班植树节活动方案
2014/03/04 职场文书
班风口号
2014/06/18 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
接收函格式
2015/01/30 职场文书
个人年终总结开头
2015/03/06 职场文书
2015公务员年度考核评语
2015/03/25 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
军训结束新闻稿
2015/07/17 职场文书
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL
python利用pandas分析学生期末成绩实例代码
2021/07/09 Python