Du forsøger at bruge forbindelsen som kontekstadministrator:
with conn:
Dette objekt implementerer ikke de nødvendige metoder til at blive brugt på den måde; det er ikke en kontekstadministrator, da den mangler (i det mindste) __exit__
metode
.
Hvis du læser en tutorial eller dokumentation, der bruger en anden MySQL-bibliotek, vær opmærksom på, at denne funktion muligvis understøttes af nogle biblioteker, bare ikke denne. MySQLdb-projektet understøtter det f.eks.
Til din specifikke I tilfælde af at du ikke engang behøver at bruge with conn:
linje overhovedet; du laver ingen ændringer i databasen, ingen commit er påkrævet nogen steder. Du kan trygt fjerne with conn:
linje (fjern indrykket alt under det et trin). Ellers kan du erstatte konteksthåndteringen med en manuel conn.commit()
andre steder.
Alternativt kan du oprette din egen kontekstadministrator til denne use-case ved hjælp af @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()
og brug dette som:
with manage_transaction(conn) as cursor:
# do things, including creating extra cursors
hvor du kan sende ekstra argumenter til connection.start_transaction()
ring
.