Está intentando usar la conexión como administrador de contexto:
with conn:
Este objeto no implementa los métodos necesarios para ser usado así; no es un administrador de contexto, ya que le falta (al menos) el __exit__
método
.
Si está leyendo un tutorial o documentación que utiliza un diferente Biblioteca MySQL, tenga en cuenta que esta función puede ser compatible con algunos bibliotecas, pero no esta. El proyecto MySQLdb lo admite, por ejemplo.
Para su específico caso, ni siquiera necesita usar with conn:
línea en absoluto; no está realizando ningún cambio en la base de datos, no se requiere compromiso en ninguna parte. Puede eliminar de forma segura el with conn:
línea (elimine la sangría de todo lo que está debajo de ella un paso). De lo contrario, puede reemplazar el administrador de contexto con un manual conn.commit()
en otro lugar.
Alternativamente, puede crear su propio administrador de contexto para este caso de uso, utilizando el @contextlib.contextmanager()
decorador
:
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()
y usa esto como:
with manage_transaction(conn) as cursor:
# do things, including creating extra cursors
donde puede pasar argumentos adicionales para connection.start_transaction()
llamar
.