web-dev-qa-db-ja.com

python MySQLdb接続での例外処理を修正

MySQLデータベースにデータを挿入するためのsmall/basic pythonスクリプトを作成しました。主に接続を閉じたり、エラーが発生した場合に接続がハングしたりしないようにするために、エラー処理をいくつか含めました(。 ..しかし、いくつかのエラーを無視することもできます)。

私が持っていたもの(以下を参照)は正しいと思いました-それは問題なく機能しているようでした。しかし、「接続が多すぎます」というエラーが発生することがあります。これは、実際には接続がまったく正しく閉じられていないことを意味していると思います(またはエラー処理が正しくない可能性があります)。

_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:_なしで試しました)

もう1つの(重要だと思う)ポイントは、MySQLデータベースがInnoDBストレージエンジンを使用していることです。私がInnoDBエンジンを使用したのはこれが初めてであり、おそらくここに関連するMyISAMとの違いがいくつかあり、私は気づいていません(conn.commit()のように、エラーが発生したため)。私の他のすべての問題の原因になること!

前もって感謝します

12
djmac

問題は、except句でconn.rollback()を呼び出さなかった(その結果、接続が適切に閉じられなかった)ことだと思います。 1行(以下を参照) 見えた 問題を修正するため(それがこの問題であったかどうかは正確にはわかりません-誰かがそれが素晴らしいことを確認できた場合)。

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()
4
djmac