2014-02-12 49 views
12

我創建了一個小型/基本的python腳本來將數據插入MySQL數據庫。我包含了一些錯誤處理 - 主要是爲了關閉連接和/或防止錯誤情況下掛起的連接(...但也忽略一些錯誤)。使用python MySQLdb連接正確處理異常

我以爲我有什麼(見下文)是對的 - 它似乎工作正常。但偶爾我得到了「太多連接」錯誤 - 我認爲這意味着我根本沒有正確關閉連接(或者錯誤處理不正確)。

conn=MySQLdb.connect(host=####, user=####, passwd=####, db=####) 
curs=conn.cursor() 
try: 
    curs.execute(sql) 
    conn.commit()   

except MySQLdb.Error as e: 
    if e[0]!= ###: 
     raise 

finally: 
    curs.close()  
    conn.close() 

(我也試過不finally:

其他(我認爲重要)的一點是,它是MySQL數據庫使用的InnoDB存儲引擎。這是我第一次使用InnoDB引擎,可能與MyISAM有一些不同之處,但我不知道(如conn.commit(),但是對於錯誤)......這似乎是所有我的其他問題!

在此先感謝

+0

您應該從'try'主體中移除'conn.close()',因爲它會在'finally'主體中調用_always_。除此之外,它看起來像你正在釋放你的連接。 – lanzz

+0

感謝Lanzz--抱歉,我錯誤地複製了代碼(在沒有'finally:的情況下玩耍,並且在'try' body **和** except' body中有'conn.close()')。 已修復的問題(還有同樣的問題,無論哪種方式) – djmac

回答

4

我相信這個問題是我是不是except子句中調用conn.rollback()(因此,連接不正確關閉)。一行(見下文)似乎來解決這個問題(我不能確切地確定,如果這是這個問題 - 如果有人可以證實這將是偉大的)。

conn=MySQLdb.connect(host=####, user=####, passwd=####, db=####) 
curs=conn.cursor() 
try: 
    curs.execute(sql) 
    conn.commit()   

except MySQLdb.Error as e: 
    conn.rollback()    #rollback transaction here 
    if e[0]!= ###: 
     raise 

finally: 
    curs.close()  
    conn.close()