Próbujesz użyć połączenia jako menedżera kontekstu:
with conn:
Ten obiekt nie implementuje niezbędnych metod do takiego użycia; nie jest menedżerem kontekstu, ponieważ brakuje (przynajmniej) __exit__
metoda
.
Jeśli czytasz samouczek lub dokumentację, która używa innego Biblioteka MySQL, pamiętaj, że ta funkcja może być obsługiwana przez niektóre biblioteki, tylko nie ta. Projekt MySQLdb obsługuje go, na przykład.
Dla Twojego konkretnego przypadku, nie musisz nawet używać with conn:
w ogóle linia; nie wprowadzasz żadnych zmian w bazie danych, nigdzie nie jest wymagane zatwierdzenie. Możesz bezpiecznie usunąć with conn:
linia (odrzuć wszystko pod nią w jednym kroku). W przeciwnym razie możesz zastąpić menedżera kontekstu ręcznym conn.commit()
gdzie indziej.
Alternatywnie możesz utworzyć własnego menedżera kontekstu dla tego przypadku użycia, używając @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()
i użyj tego jako:
with manage_transaction(conn) as cursor:
# do things, including creating extra cursors
gdzie możesz przekazać dodatkowe argumenty dla connection.start_transaction()
zadzwoń
.