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 相关文章推荐
go语言计算两个时间的时间差方法
Mar 13 Python
详解django中自定义标签和过滤器
Jul 03 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
Nov 14 Python
python实现快速排序的示例(二分法思想)
Mar 12 Python
基于numpy中数组元素的切片复制方法
Nov 15 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
Django框架视图函数设计示例
Jul 29 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
python matplotlib包图像配色方案分享
Mar 14 Python
python模拟哔哩哔哩滑块登入验证的实现
Apr 24 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 Python
python 管理系统实现mysql交互的示例代码
Dec 06 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数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
php反射应用示例
2014/02/25 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
【消息提示组件】,兼容IE6/7&&FF2
2007/09/04 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
2018/09/28 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
Python实现快速多线程ping的方法
2015/07/15 Python
Python 处理数据的实例详解
2017/08/10 Python
MySQL适配器PyMySQL详解
2017/09/20 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
计算机专业职业生涯规划范文
2014/01/19 职场文书
经典演讲稿汇总
2014/05/19 职场文书
学生实习证明范文
2014/09/28 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
导游词之河北邯郸
2019/09/12 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电