Você está tentando usar a conexão como gerenciador de contexto:
with conn:
Este objeto não implementa os métodos necessários para ser usado assim; não é um gerenciador de contexto, pois está faltando (pelo menos) o
__exit__
método
. Se você estiver lendo um tutorial ou documentação que usa um diferente Biblioteca MySQL, esteja ciente de que este recurso pode ser suportado por algumas bibliotecas, mas não esta. O projeto MySQLdb suporta, por exemplo.
Para o seu específico caso, você nem precisa usar o
with conn:
linha em tudo; você não está fazendo nenhuma alteração no banco de dados, nenhum commit é necessário em nenhum lugar. Você pode remover com segurança o with conn:
linha (sem recuar tudo sob ela em um passo). Caso contrário, você pode substituir o gerenciador de contexto por um manual conn.commit()
em outro lugar. Como alternativa, você pode criar seu próprio gerenciador de contexto para este caso de uso, usando o
@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()
e use isso como:
with manage_transaction(conn) as cursor:
# do things, including creating extra cursors
onde você pode passar argumentos extras para o
connection.start_transaction()
ligue
.