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中装饰器的一个妙用
Feb 08 Python
python BeautifulSoup设置页面编码的方法
Apr 03 Python
python实现寻找最长回文子序列的方法
Jun 02 Python
Python错误处理操作示例
Jul 18 Python
Python使用while循环花式打印乘法表
Jan 28 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
Django MEDIA的配置及用法详解
Jul 25 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
Python多分支if语句的使用
Sep 03 Python
简单了解Python字典copy与赋值的区别
Sep 16 Python
浅谈Python 中的复数问题
May 19 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
phalcon框架使用指南
2016/02/23 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
浅谈Sizzle的“编译原理”
2015/04/14 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
js实现仿京东2级菜单效果(带延时功能)
2015/08/27 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
2016/06/25 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
tensorflow 模型权重导出实例
2020/01/24 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
django正续或者倒序查库实例
2020/05/19 Python
python re的findall和finditer的区别详解
2020/11/15 Python
详解pandas赋值失败问题解决
2020/11/29 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
Ever New加拿大官网:彰显女性美
2018/10/05 全球购物
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
护士实习生自我鉴定范文
2013/12/10 职场文书
物控部经理职务说明书
2014/02/25 职场文书
投标承诺书范本
2014/03/27 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
求职教师自荐书
2014/06/19 职场文书
高三毕业评语
2014/12/31 职场文书
高中班主任寄语
2019/06/21 职场文书
导游词之杭州西湖
2019/09/19 职场文书
yolov5返回坐标的方法实例
2022/03/17 Python