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判断windows隐藏文件的方法
Mar 21 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
Zookeeper接口kazoo实例解析
Jan 22 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 Python
一篇文章了解Python中常见的序列化操作
Jun 20 Python
pandas read_excel()和to_excel()函数解析
Sep 19 Python
python新式类和经典类的区别实例分析
Mar 23 Python
基于Python实现全自动下载抖音视频
Nov 06 Python
详解Python中openpyxl模块基本用法
Feb 23 Python
Python中json.dumps()函数的使用解析
May 17 Python
python随机打印成绩排名表
Jun 23 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
如何选购合适的收音机
2021/03/01 无线电
php mysql数据库操作类
2008/06/04 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
Linux编译升级php的详细方法
2013/11/04 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
框架页面高度自动刷新的Javascript脚本
2013/11/01 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
js实现3D旋转相册
2020/08/02 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
MAC中PyCharm设置python3解释器
2017/12/15 Python
Python基于Faker假数据构造库
2020/11/30 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
数组越界问题
2015/10/21 面试题
出生证明公证书
2014/04/09 职场文书
交通事故私了协议书
2014/04/16 职场文书
新兵入伍心得体会
2014/09/04 职场文书
银行招聘自荐信
2015/03/06 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL