Опитвате се да използвате връзката като контекстен мениджър:
with conn:
Този обект не прилага необходимите методи, за да се използва по този начин; не е контекстен мениджър, тъй като му липсва (поне) __exit__
метод
.
Ако четете урок или документация, която използва различен MySQL библиотека, имайте предвид, че тази функция може да се поддържа от някои библиотеки, само не тази. Проектът MySQLdb го поддържа, например.
За вашите специфични случай, дори не е необходимо да използвате with conn:
линия изобщо; не правите никакви промени в базата данни, никъде не се изисква ангажимент. Можете безопасно да премахнете with conn:
ред (премахнете отстъпа на всичко под него с една стъпка). В противен случай можете да замените контекстния мениджър с ръчен 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()
обаждане
.