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 时间处理datetime实例
Sep 06 Python
在Python程序中操作MySQL的基本方法
Jul 29 Python
Python编程pygame模块实现移动的小车示例代码
Jan 03 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
python os用法总结
Jun 08 Python
pandas中apply和transform方法的性能比较及区别介绍
Oct 30 Python
matplotlib.pyplot绘图显示控制方法
Jan 15 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
Aug 17 Python
python中安装django模块的方法
Mar 12 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 Python
python文件目录操作之os模块
May 08 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修改session_id示例代码
2014/01/08 PHP
php调用nginx的mod_zip模块打包ZIP文件
2014/06/11 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
2015/03/27 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
javascript 播放器 控制
2007/01/22 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
js获取location.href的参数实例代码
2013/08/02 Javascript
jquery设置控件位置的方法
2013/08/21 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
Vue多系统切换实现方案
2018/06/05 Javascript
javascript如何实现create方法
2019/11/04 Javascript
微信小程序实现搜索功能
2020/03/10 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
大学生的四年学习自我评价
2013/12/13 职场文书
党校学习党性分析材料
2014/12/19 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
工程主管竞聘书
2015/09/15 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android