欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python SQLAlchemy 中的Engine詳解

 更新時(shí)間:2019年07月04日 10:20:08   作者:FOOFISH-PYTHON之禪  
這篇文章主要介紹了python SQLAlchemy 中的Engine詳解,Engine 翻譯過(guò)來(lái)就是引擎的意思,汽車通過(guò)引擎來(lái)驅(qū)動(dòng),而 SQLAlchemy 是通過(guò) Engine 來(lái)驅(qū)動(dòng),Engine 維護(hù)了一個(gè)連接池(Pool)對(duì)象和方言(Dialect),需要的朋友可以參考下

先看這張圖,這是從官方網(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ì)被回收。

參考鏈接:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論