Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

AttributeError:__exit__ em python 3.4


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 .