2013-03-21 66 views
1

我正在處理一些連接到sqlite數據庫的代碼。在調試所述代碼的過程中,我遇到了一些問題,因爲某些錯誤阻止了關閉命令的執行,所以我將數據庫連接斷開。因爲db和c是在一個函數中定義的,所以我不能從命令行找到並關閉這些對象。他們就像孤兒連接或其他什麼東西,但無論如何,他們阻止我對數據庫做其他事情,直到我關閉並重新打開交互式控制檯。這裏是什麼樣子:如何確保sqlite數據庫連接在調試過程中被關閉?

def something() 
    db=sqlite3.connect('mydatabase') 
    c=db.cursor() 

    somecode 
    lots of different things happening in here 
    this may have errors 
    thus stopping execution 

    db.commit() 
    c.close() 
    db.close() 

我已經試過一試/除非在「最後」塊與最終收盤操作條款,但是,當我調試防止異常被回升到交互輸出,而事情「默默地」失敗了(也許我沒有那麼做)?有一個更好的方法嗎?

回答

5

一般來說這是很好的與使用......作爲聲明:

with sqlite.connect(...) as db: 
    with db.cursor() as c: 
     ... 

聲明保證關閉( )會在語句結束或異常引發時在對象上調用。即使從內部調用回報或收益。

在這裏閱讀更多: http://docs.python.org/2/reference/compound_stmts.html#with

+0

謝謝。這比try/finally方法更簡單,並且似乎不太容易產生「無聲」錯誤。很好,很乾淨。歡呼聲 – andy 2013-03-21 17:19:46

0

清理資源,使用只有finally

db = sqlite.connect(...) 
try: 
    ... 
    c = db.cursor() 
    try: 
     ... 
    finally: 
     c.close() 
    ... 
finally: 
    db.close() 
+0

我認爲這樣做會有效,但與...一樣...的方法似乎更好。我想我仍然有問題,我怎麼做/除了/最後因爲我不斷收到那些沉默的錯誤。謝謝 – andy 2013-03-21 17:21:00

2

正如指出的彼得,使用with語句使得對更高效的代碼,但它並沒有明確關閉到數據庫的連接,如果這是需要由用戶。這是通過類似的問題here發現的。

如果with語句中的代碼塊執行時沒有錯誤,那麼使用with語句的做法是運行con.commit()方法;或者如果遇到異常,則使用con.rollback()方法。

實施例從http://docs.python.org/2/library/sqlite3.html

import sqlite3 

con = sqlite3.connect(":memory:") 
con.execute("create table person (id integer primary key, firstname varchar unique)") 

with con: 
    con.execute("insert into person(firstname) values (?)", ("Joe",)) 

# If Successful, con.commit() is called automatically afterwards 
# else con.rollback() is called after the with block finishes with an exception, 
# the exception is still raised and must be caught 

try: 
    with con: 
     con.execute("insert into person(firstname) values (?)", ("Joe",)) 
except sqlite3.IntegrityError: 
    print "couldn't add Joe twice" 

使用注意事項的快捷方法con.execute的(),它是數據庫連接對象的方法。這隱式地爲您創建遊標對象並返回結果,因此需要編寫更少的代碼。

+0

con.execute()! – andy 2013-07-05 16:30:18

相關問題