python SQLAlchemy 中的Engine詳解
先看這張圖,這是從官方網(wǎng)站扒下來(lái)的。

Engine 翻譯過(guò)來(lái)就是引擎的意思,汽車通過(guò)引擎來(lái)驅(qū)動(dòng),而 SQLAlchemy 是通過(guò) Engine 來(lái)驅(qū)動(dòng),Engine 維護(hù)了一個(gè)連接池(Pool)對(duì)象和方言(Dialect)。方言簡(jiǎn)單而言就是你連的到底是 MySQL 還是 Oracle 或者 PostgreSQL 還是其它數(shù)據(jù)庫(kù),關(guān)于方言(Dialect)的介紹在另外一篇文章有介紹,可參考數(shù)據(jù)庫(kù)方言dialect。
連接池很重要,因?yàn)槊看伟l(fā)送sql查詢的時(shí)候都需要先建立連接,如果程序啟動(dòng)的時(shí)候事先就初始化一批連接放在連接池,每次用完后又放回連接池給其它請(qǐng)求使用,就能大大提高查詢的效率。
Engine 初始化
Engine 的初始化非常簡(jiǎn)單,通過(guò)工廠函數(shù) create_engine 就可以創(chuàng)建。
from sqlalchemy import create_engine
engine = create_engine('mysql://user:password@localhost:3306/test?charset=utf8mb4')
構(gòu)建好 Engine 對(duì)象的同時(shí),連接池和Dialect也創(chuàng)建好了,但是這時(shí)候并不會(huì)立馬與數(shù)據(jù)庫(kù)建立真正的連接,只有你調(diào)用 Engine.connect() 或者 Engine.execute(sql) 執(zhí)行SQL請(qǐng)求的時(shí)候,才會(huì)建立真正的連接。因此 Engine 和 Pool 的行為稱之為延遲初始化,用現(xiàn)在流行的話來(lái)說(shuō)就是延遲滿足感,等真正要派上用場(chǎng)的時(shí)候才去建立連接。
需要注意的是,創(chuàng)建引擎時(shí),如果數(shù)據(jù)庫(kù)的密碼含有特殊字符,需要先編碼處理
>>> import urllib.parse
>>> urllib.parse.quote_plus("kx%jj5/g")
'kx%25jj5%2Fg'
其它數(shù)據(jù)庫(kù)方言初始化 engine 的方式可參考官方文檔
create_engine 還有很多可選參數(shù),這里介紹幾個(gè)重要的參數(shù)。
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 時(shí)候會(huì)把sql語(yǔ)句打印出來(lái),當(dāng)然,你可以通過(guò)配置logger來(lái)控制輸出,這里不做討論。
pool_size: 是連接池的大小,默認(rèn)為5個(gè),0表示連接數(shù)無(wú)限制
pool_recycle: MySQL 默認(rèn)情況下如果一個(gè)連接8小時(shí)內(nèi)容沒(méi)有任何動(dòng)作(查詢請(qǐng)求)就會(huì)自動(dòng)斷開(kāi)鏈接,出現(xiàn) MySQL has gone away的錯(cuò)誤。設(shè)置了 pool_recycle 后 SQLAlchemy 就會(huì)在指定時(shí)間內(nèi)回收連接。如果設(shè)置為3600 就表示 1小時(shí)后該連接會(huì)被自動(dòng)回收。
pool_pre_ping : 這是1.2新增的參數(shù),如果值為True,那么每次從連接池中拿連接的時(shí)候,都會(huì)向數(shù)據(jù)庫(kù)發(fā)送一個(gè)類似 select 1 的測(cè)試查詢語(yǔ)句來(lái)判斷服務(wù)器是否正常運(yùn)行。當(dāng)該連接出現(xiàn) disconnect 的情況時(shí),該連接連同pool中的其它連接都會(huì)被回收。
參考鏈接:
- 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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 基于sqlalchemy對(duì)mysql實(shí)現(xiàn)增刪改查操作
- 基于SQLAlchemy實(shí)現(xiàn)操作MySQL并執(zhí)行原生sql語(yǔ)句
- python數(shù)據(jù)庫(kù)操作mysql:pymysql、sqlalchemy常見(jiàn)用法詳解
- python orm 框架中sqlalchemy用法實(shí)例詳解
- python使用SQLAlchemy操作MySQL
- Python SQLAlchemy入門教程(基本用法)
- python SQLAlchemy的Mapping與Declarative詳解
- Python流行ORM框架sqlalchemy安裝與使用教程
- python 獲取sqlite3數(shù)據(jù)庫(kù)的表名和表字段名的實(shí)例
- Python_查看sqlite3表結(jié)構(gòu),查詢語(yǔ)句的示例代碼
- python使用sqlite3時(shí)游標(biāo)使用方法
- Python SQLite3簡(jiǎn)介
- Python使用flask框架操作sqlite3的兩種方式
- python與sqlite3實(shí)現(xiàn)解密chrome cookie實(shí)例代碼
- Python SQLite3數(shù)據(jù)庫(kù)日期與時(shí)間常見(jiàn)函數(shù)用法分析
- Python實(shí)現(xiàn)讀取TXT文件數(shù)據(jù)并存進(jìn)內(nèi)置數(shù)據(jù)庫(kù)SQLite3的方法
- Python開(kāi)發(fā)SQLite3數(shù)據(jù)庫(kù)相關(guān)操作詳解【連接,查詢,插入,更新,刪除,關(guān)閉等】
- Python sqlite3事務(wù)處理方法實(shí)例分析
- Python簡(jiǎn)單操作sqlite3的方法示例
- Python3+SQLAlchemy+Sqlite3實(shí)現(xiàn)ORM教程
相關(guān)文章
Python+SeaTable實(shí)現(xiàn)計(jì)算兩個(gè)日期間的工作日天數(shù)
在實(shí)際的項(xiàng)目管理、任務(wù)管理、工作計(jì)劃等場(chǎng)景中,某些時(shí)間段會(huì)涉及雙休日、法定節(jié)假日,甚至還有公司自定義的工作時(shí)間安排,所以就需要計(jì)算出兩個(gè)日期間的實(shí)際工作日天數(shù)。本文用Python+SeaTable實(shí)現(xiàn)這一需求,需要的可以參考一下2022-07-07
Python學(xué)習(xí)之時(shí)間包使用教程詳解
本文主要介紹了Python中的內(nèi)置時(shí)間包:datetime包?與?time包?,通過(guò)學(xué)習(xí)時(shí)間包可以讓我們的開(kāi)發(fā)過(guò)程中對(duì)時(shí)間進(jìn)行輕松的處理,快來(lái)跟隨小編一起學(xué)習(xí)一下吧2022-03-03
Python+Tensorflow+CNN實(shí)現(xiàn)車牌識(shí)別的示例代碼
這篇文章主要介紹了Python+Tensorflow+CNN實(shí)現(xiàn)車牌識(shí)別的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
python transpose()處理高維度數(shù)組的軸變換的實(shí)現(xiàn)
本文主要介紹了python transpose()處理高維度數(shù)組的軸變換的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09
python裝飾器-限制函數(shù)調(diào)用次數(shù)的方法(10s調(diào)用一次)
下面小編就為大家分享一篇python裝飾器-限制函數(shù)調(diào)用次數(shù)的方法(10s調(diào)用一次),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Python 尋找局部最高點(diǎn)的實(shí)現(xiàn)
今天小編就為大家分享一篇Python 尋找局部最高點(diǎn)的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12

