Anda mencoba menggunakan koneksi sebagai pengelola konteks:
with conn:
Objek ini tidak menerapkan metode yang diperlukan untuk digunakan seperti itu; itu bukan manajer konteks, karena tidak ada (setidaknya) __exit__
metode
.
Jika Anda membaca tutorial atau dokumentasi yang menggunakan berbeda Perpustakaan MySQL, perlu diketahui bahwa fitur ini mungkin didukung oleh beberapa perpustakaan, hanya saja tidak yang ini. Proyek MySQLdb mendukungnya, misalnya.
Untuk spesifik . Anda kasus, Anda bahkan tidak perlu menggunakan with conn:
garis sama sekali; Anda tidak membuat perubahan apa pun pada database, tidak diperlukan komit di mana pun. Anda dapat menghapus with conn:
baris (hapus semua yang ada di bawahnya satu langkah). Jika tidak, Anda dapat mengganti pengelola konteks dengan conn.commit()
manual manual di tempat lain.
Atau, Anda dapat membuat pengelola konteks Anda sendiri untuk kasus penggunaan ini, menggunakan @contextlib.contextmanager()
dekorator
:
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()
dan gunakan ini sebagai:
with manage_transaction(conn) as cursor:
# do things, including creating extra cursors
di mana Anda dapat memberikan argumen tambahan untuk connection.start_transaction()
telepon
.