Pokoušíte se použít připojení jako správce kontextu:
with conn:
Tento objekt neimplementuje nezbytné metody, aby mohl být takto použit; není to kontextový manažer, protože chybí (alespoň) __exit__
metoda
.
Pokud čtete výukový program nebo dokumentaci, která používá jiné Knihovna MySQL, mějte na paměti, že tuto funkci mohou někteří podporovat knihovny, jen ne tuto. projekt MySQLdb například to podporuje.
Pro vaše konkrétní V tomto případě ani nemusíte používat with conn:
linka vůbec; v databázi neprovádíte žádné změny, nikde není vyžadováno potvrzení. with conn:
můžete bezpečně odebrat řádek (odsazení všeho pod ním o jeden krok). Jinak můžete kontextový manažer nahradit ručním conn.commit()
jinde.
Alternativně můžete pro tento případ použití vytvořit svůj vlastní kontextový manažer pomocí @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()
a použijte toto jako:
with manage_transaction(conn) as cursor:
# do things, including creating extra cursors
kde můžete předat další argumenty pro connection.start_transaction()
zavolat
.