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配置文件解析模块ConfigParser使用实例
Apr 13 Python
Python求导数的方法
May 09 Python
python类和继承用法实例
Jul 07 Python
Python实现读取并保存文件的类
May 11 Python
python学习入门细节知识点
Mar 29 Python
python求解数组中两个字符串的最小距离
Sep 27 Python
实例详解Python装饰器与闭包
Jul 29 Python
pytorch实现对输入超过三通道的数据进行训练
Jan 15 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
Python dict的常用方法示例代码
Jun 23 Python
python判断变量是否为列表的方法
Sep 17 Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 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
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
YII2框架使用控制台命令的方法分析
2020/03/18 PHP
jQuery中实现动画效果的基本操作介绍
2013/04/16 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
ES6的解构赋值实例详解
2019/05/06 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
python制作一个桌面便签软件
2015/08/09 Python
Python入门之三角函数全解【收藏】
2017/11/08 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
Python运行异常管理解决方案
2020/03/09 Python
pygame实现飞机大战
2020/03/11 Python
使用Python构造hive insert语句说明
2020/06/06 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
商务英语应届生自我鉴定
2013/12/08 职场文书
英语自我评价范文
2014/01/24 职场文书
应届毕业生简历自我评价
2014/01/31 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫