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实现的去除win下文本文件头部BOM的代码
Feb 10 Python
Python re模块介绍
Nov 30 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
python通过ftplib登录到ftp服务器的方法
May 08 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
Python进行数据提取的方法总结
Aug 22 Python
Python金融数据可视化汇总
Nov 17 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
Python常见反爬虫机制解决方案
Jun 01 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 Python
k-means & DBSCAN 总结
Apr 27 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的面向对象编程
2006/10/09 PHP
php抓取https的内容的代码
2010/04/06 PHP
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
php无限级分类实现方法分析
2016/10/19 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
jquery 最简单的属性菜单
2009/10/08 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
python中的hashlib和base64加密模块使用实例
2014/09/02 Python
举例讲解Python中的算数运算符的用法
2015/05/13 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
对python 操作solr索引数据的实例详解
2018/12/07 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
Django框架视图函数设计示例
2019/07/29 Python
python数据化运营的重要意义
2019/11/25 Python
python类共享变量操作
2020/09/03 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
环保宣传标语
2014/06/12 职场文书
小学德育工作总结2015
2015/05/12 职场文书
《学会看病》教学反思
2016/02/17 职场文书
辞职信怎么写?你都知道吗?
2019/06/24 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP