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 paramiko实现ssh远程访问的方法
Dec 03 Python
Python列出一个文件夹及其子目录的所有文件
Jun 30 Python
python3 pillow生成简单验证码图片的示例
Sep 19 Python
python文件名和文件路径操作实例
Sep 29 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
Python字符串格式化%s%d%f详解
Feb 02 Python
python实现装饰器、描述符
Feb 28 Python
Flask框架信号用法实例分析
Jul 24 Python
Python数据报表之Excel操作模块用法分析
Mar 11 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
python框架flask入门之环境搭建及开启调试
Jun 07 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 set_time_limit(0)长连接的实现分析
2010/03/02 PHP
php中使用preg_match_all匹配文章中的图片
2013/02/06 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
Javascript学习指南
2014/12/01 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
python中的闭包用法实例详解
2015/05/05 Python
利用Python进行异常值分析实例代码
2017/12/07 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
2019史上最全Database工程师题库
2015/12/06 面试题
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
幼儿园实习生辞职信
2014/01/20 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
高二学生评语大全
2014/04/25 职场文书
面试必备的求职信
2014/05/25 职场文书
跳蚤市场口号
2014/06/13 职场文书
安全责任书模板
2014/07/22 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
歌舞青春观后感
2015/06/10 职场文书
入学证明
2015/06/23 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
如何使用pdb进行Python调试
2021/06/30 Python
Win11更新失败并提示0xc1900101
2022/04/19 数码科技