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学习笔记(二)基础语法
Jun 06 Python
python模拟鼠标拖动操作的方法
Mar 11 Python
打包发布Python模块的方法详解
Sep 18 Python
Python实现加载及解析properties配置文件的方法
Mar 29 Python
python写入并获取剪切板内容的实例
May 31 Python
python连接mongodb密码认证实例
Oct 16 Python
python3.6环境安装+pip环境配置教程图文详解
Jun 20 Python
PyCharm2018 安装及破解方法实现步骤
Sep 09 Python
Python3 A*寻路算法实现方式
Dec 24 Python
基于python实现语音录入识别代码实例
Jan 17 Python
python logging通过json文件配置的步骤
Apr 27 Python
解决python3输入的坑——input()
Dec 05 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访问Google Search API的方法
2015/03/05 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
javascript静态的url如何传递
2007/05/03 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
酷! 不同风格页面布局幻灯片特效js实现
2021/02/19 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
2018/12/22 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
Python字符编码与函数的基本使用方法
2017/09/30 Python
浅析python,PyCharm,Anaconda三者之间的关系
2019/11/27 Python
关于多元线性回归分析——Python&SPSS
2020/02/24 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
电气自动化个人求职信范文
2014/02/03 职场文书
高校教师自荐信范文
2014/03/13 职场文书
美术第二课堂活动总结
2014/07/08 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
总经理岗位职责
2015/02/04 职场文书
党小组考察意见
2015/06/02 职场文书
会计手工模拟做账心得体会
2016/01/22 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏