U probeert de verbinding te gebruiken als contextbeheerder:
with conn:
Dit object implementeert niet de noodzakelijke methoden om zo te worden gebruikt; het is geen contextmanager, omdat het (tenminste) de __exit__
methode
.
Als je een tutorial of documentatie leest die een andere . gebruikt MySQL-bibliotheek, houd er rekening mee dat deze functie mogelijk wordt ondersteund door sommige bibliotheken, alleen deze niet. Het MySQLdb-project ondersteunt het bijvoorbeeld.
Voor uw specifieke geval hoeft u niet eens de with conn:
. te gebruiken lijn helemaal; je brengt geen wijzigingen aan in de database, er is nergens een commit vereist. U kunt de with conn:
regel (maak alles eronder één stap ongedaan). Anders kunt u de contextmanager vervangen door een handmatige conn.commit()
elders.
Als alternatief kunt u uw eigen contextmanager voor deze use-case maken, met behulp van de @contextlib.contextmanager()
binnenhuisarchitect
:
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()
en gebruik dit als:
with manage_transaction(conn) as cursor:
# do things, including creating extra cursors
waar je extra argumenten kunt invoeren voor de connection.start_transaction()
bel
.