接続をコンテキストマネージャーとして使用しようとしています:
with conn:
このオブジェクトは、そのように使用するために必要なメソッドを実装していません。 __exit__
メソッド
。
異なるを使用するチュートリアルまたはドキュメントを読んでいる場合 MySQLライブラリ、この機能は一部でサポートされている可能性があることに注意してください ライブラリ、これだけではありません。 MySQLdbプロジェクト たとえば、それをサポートします。
特定の この場合、with conn:
を使用する必要はありません。 まったく行;データベースに変更を加えていないので、どこにもコミットは必要ありません。 with conn:
で安全に削除できます 行(その下のすべてのインデントを1ステップ外します)。それ以外の場合は、コンテキストマネージャーを手動のconn.commit()
に置き換えることができます。 他の場所。
または、 @contextlib.contextmanager()
デコレータ
:
from contextlib import contextmanager
@contextmanager
def manage_transaction(conn, *args, **kw):
exc = False
try:
try:
conn.start_transaction(*args, **kw)
yield conn.cursor()
except:
exc = True
conn.rollback()
finally:
if not exc:
conn.commit()
これを次のように使用します:
with manage_transaction(conn) as cursor:
# do things, including creating extra cursors
ここで、 connection.start_transaction()
電話
。