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多线程并发让两个LED同时亮的方法
Feb 18 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
May 21 Python
pyQt5实时刷新界面的示例
Jun 25 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
基于python修改srt字幕的时间轴
Feb 03 Python
keras tensorflow 实现在python下多进程运行
Feb 06 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
Python matplotlib修改默认字体的操作
Mar 05 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
tensorflow中tf.reduce_mean函数的使用
Apr 19 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 Python
Python Django搭建文件下载服务器的实现
May 10 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
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
js中less常用的方法小结
2017/08/09 Javascript
微信小程序实现留言板
2018/10/31 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
2020/02/23 Javascript
Python的面向对象编程方式学习笔记
2016/07/12 Python
python查询mysql,返回json的实例
2018/03/26 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
实用求职信范文分享
2013/12/25 职场文书
工厂会计员职责
2014/02/06 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
出生公证书样本
2014/04/04 职场文书
赡养老人协议书
2014/04/21 职场文书
淘宝客服工作职责
2014/07/11 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS