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中操作文件之seek()方法的使用教程
May 24 Python
详解Python验证码识别
Jan 25 Python
python中reduce()函数的使用方法示例
Sep 29 Python
解决python "No module named pip" 的问题
Oct 13 Python
Django如何将URL映射到视图
Jul 29 Python
解决安装pyqt5之后无法打开spyder的问题
Dec 13 Python
Python实现屏幕录制功能的代码
Mar 02 Python
Python调用接口合并Excel表代码实例
Mar 31 Python
如何通过python检查文件是否被占用
Dec 18 Python
变长双向rnn的正确使用姿势教学
May 31 Python
Python初学者必备的文件读写指南
Jun 23 Python
5行Python代码实现一键批量扣图
Jun 29 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 过滤器实现代码
2010/08/09 PHP
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
前端面试知识点目录一览
2019/04/15 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
详解Python编程中包的概念与管理
2015/10/16 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
娇韵诗加拿大官网:Clarins加拿大
2017/11/20 全球购物
介绍一下Java中的Class类
2015/04/10 面试题
高二地理教学反思
2014/01/24 职场文书
应届电子商务毕业自荐书范文
2014/02/11 职场文书
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python
室外天线与收音机天线杆接合方法
2022/04/05 无线电