Mysql
 sql >> Database >  >> RDS >> Mysql

AttributeError:__exit__ su Python 3.4

Stai tentando di utilizzare la connessione come gestore del contesto:

with conn:

Questo oggetto non implementa i metodi necessari per essere utilizzato in questo modo; non è un gestore di contesto, in quanto manca (almeno) il __exit__ metodo .

Se stai leggendo un tutorial o una documentazione che utilizza un diverso Libreria MySQL, tieni presente che questa funzionalità potrebbe essere supportata da alcuni biblioteche, ma non questa. Il progetto MySQLdb lo supporta, per esempio.

Per il tuo specifico caso, non è nemmeno necessario utilizzare with conn: linea a tutti; non stai apportando modifiche al database, non è richiesto alcun commit da nessuna parte. Puoi rimuovere in sicurezza il with conn: line (annulla tutto sotto di essa di un passaggio). Altrimenti puoi sostituire il gestore del contesto con un manuale conn.commit() altrove.

In alternativa, puoi creare il tuo gestore di contesto per questo caso d'uso, utilizzando @contextlib.contextmanager() decoratore :

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 usalo come:

with manage_transaction(conn) as cursor:
    # do things, including creating extra cursors

dove puoi passare argomenti aggiuntivi per connection.start_transaction() chiama .