2016-01-26 108 views
0

我使用燒瓶瓶,MySQL和先前執行以下操作使用時,不同的類型:mysql.connect()返回聲明

db = mysql.connect() 
cursor = db.cursor() 
#do database stuff 
cursor.close() 
db.close() 

但我想我會做的事情有點清潔而更地道,所以我嘗試:

with mysql.connect() as db, db.cursor() as cursor: 
    #do database stuff 

它給了我下面的錯誤「AttributeError的:‘光標’對象有沒有屬性‘光標’」

一個小調查後,當我做mysql.connec t()在它自己它正在返回一個連接對象,但當我在一個with語句中執行它...它返回一個遊標對象!所以這個工程:

with mysql.connect() as cursor: 
    #do database stuff 

所以這是怎麼回事呢?爲什麼在with語句中返回類型會改變?我查看了Flask-MySQL的源代碼,但找不到任何東西...

此外,這仍然會正常工作,以關閉db連接在塊結束?

相關版本信息:

  • 的Python == 2.7.3
  • 燒瓶== 0.10.1
  • 燒瓶的MySQL == 1.3

回答

2

表達:

with X as Y: 
    .... 

並不意味着Y「is」X。相反,X.__enter__()被調用,然後對with語句的主體綁定到Y

with正文的末尾,或者在發生異常時,調用X.__exit__(...)來處理成功或失敗。

在這種情況下,mysql.connect()的結果,這是一個連接,暴露的上下文管理器,它執行以下操作:

  • __enter__創建一個光標和開始一個事務;
  • __exit__要麼酌情提交或回滾事務。
+0

但是,當我在https://github.com/cyberdelia/flask-mysql/blob/master/flaskext/mysql.py檢查瓶MySQL的源代碼中有no__enter__OR__exit__function班上,只有an__init__功能。 – jcmiller11

+1

@jcmiller正如我所說的,它是'mysql.connect()'的**結果**,它暴露了上下文管理器API。在這種情況下,結果是'MySQLdb.connect'的返回值(請參閱您鏈接的代碼),它是一個'MySQLdb.Connection' ...這是暴露api的類。 – donkopotamus

+0

好的,謝謝@ donkopotamus,幫助我把頭圍繞在它周圍。 – jcmiller11