Du försöker använda anslutningen som en kontexthanterare:
with conn:
Detta objekt implementerar inte de nödvändiga metoderna för att användas på det sättet; det är inte en kontexthanterare, eftersom den saknar (åtminstone) __exit__
metod
.
Om du läser en handledning eller dokumentation som använder en annan MySQL-biblioteket, tänk på att den här funktionen kan stödjas av vissa bibliotek, bara inte det här. MySQLdb-projektet stöder det till exempel.
För din specifika fall behöver du inte ens använda with conn:
linje alls; du gör inga ändringar i databasen, ingen commit krävs någonstans. Du kan säkert ta bort with conn:
linje (ta bort allt under ett steg). Annars kan du ersätta kontexthanteraren med en manuell conn.commit()
någon annanstans.
Alternativt kan du skapa din egen kontexthanterare för detta användningsfall, med hjälp av @contextlib.contextmanager()
dekoratör
:
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()
och använd detta som:
with manage_transaction(conn) as cursor:
# do things, including creating extra cursors
där du kan skicka in extra argument för connection.start_transaction()
ring
.