2013-10-22 42 views
3

我正在做一個教程,遇到了一個處理sqlite3連接的方法, 然後我研究了WITH關鍵字,發現它是另一種嘗試,除了最後處事方式在python中使用sqlite3並加上「WITH」關鍵字

有人說,在文件處理的情況下,「用」自動處理文件的結束,我想與連接類似的zetcode教程說: -

「隨着使用關鍵字,Python解釋器會自動釋放資源,並提供錯誤處理。「 http://zetcode.com/db/sqlitepythontutorial/

,所以我認爲這將是很好用的搬運東西這種方式,但我無法弄清楚,爲什麼這兩個(內部範圍和外部範圍)語句的工作?不應該釋放連接?

import sqlite3 

con = sqlite3.connect('test.db') 

with con:  
    cur = con.cursor()  

    cur.execute('SELECT 1,SQLITE_VERSION()') 
    data = cur.fetchone() 
    print data   

cur.execute('SELECT 2,SQLITE_VERSION()') 
data = cur.fetchone() 
print data 

其輸出

(1, u'3.6.21') 
(2, u'3.6.21') 

我不知道究竟是什麼WITH是在這裏做(或不一般的),所以,如果你請詳細說明了TRY CATCH使用與在這方面。

而且應該在每個查詢中打開和關閉連接嗎? (我正在一個函數裏面提出查詢,我每次都用一個參數調用函數)這是否是一個好習慣?

+0

閱讀:http://docs.python.org/2/library/sqlite3.html#using-the-connection-as-一個上下文管理器 - 應該解釋你的問題 –

回答

2

從文檔:http://docs.python.org/2/library/sqlite3.html#using-the-connection-as-a-context-manager

連接對象可以被用作上下文管理器可以自動提交或回滾事務。如果發生異常,交易將回滾;否則,交易承諾:

所以,上下文管理者不知道發佈連接,相反,它保證了在連接上發生的任何交易都將回滾如果出現任何異常,或犯其他。例如,對於DELETE,UPDATEINSERT查詢有用。

+0

所以沒有釋放的資源或錯誤處理廣告呢? – Aavaas

+0

您正在閱讀的教程有點誤導。使用默認上下文管理器時,沒有顯式關閉連接。你可能想看看'contextlib.closing' ... –

3

通常情況下,上下文管理器可以自由地執行任何作者希望它在使用時執行的操作。設置/重置某個系統狀態,使用後清理資源,獲取/釋放鎖等。

特別是,作爲Jon already writes,數據庫連接對象在用作上下文管理器時會創建一個事務。如果你想自動關閉連接,你可以做

with contextlib.closing(sqlite3.connect('test.db')) as con: 
    with con as cur: 
     cur.execute('SELECT 1,SQLITE_VERSION()') 
     data = cur.fetchone() 
     print data   

    with con as cur: 
     cur.execute('SELECT 2,SQLITE_VERSION()') 
     data = cur.fetchone() 
     print data