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从入门到精通(DAY 3)
Dec 20 Python
python实现Adapter模式实例代码
Feb 09 Python
python matplotlib实现双Y轴的实例
Feb 12 Python
在Python文件中指定Python解释器的方法
Feb 18 Python
Python实现合并excel表格的方法分析
Apr 13 Python
Python实现微信消息防撤回功能的实例代码
Apr 29 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
python实现俄罗斯方块小游戏
Apr 24 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
Jul 06 Python
关于python中readlines函数的参数hint的相关知识总结
Jun 24 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+MySQL的聊天室设计
2006/10/09 PHP
php设计模式 Strategy(策略模式)
2011/06/26 PHP
多个PHP中文字符串截取函数
2013/11/12 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
php中使用session防止用户非法登录后台的方法
2015/01/27 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
python实现flappy bird游戏
2018/12/24 Python
Python编程flask使用页面模版的方法
2018/12/28 Python
python批量创建指定名称的文件夹
2019/03/21 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
keras自定义损失函数并且模型加载的写法介绍
2020/06/15 Python
python设置中文界面实例方法
2020/10/27 Python
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
大学生专业个人学习的自我评价
2013/10/26 职场文书
庆六一开幕词
2015/01/29 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript