Mysql
 sql >> Datenbank >  >> RDS >> Mysql

AttributeError:__exit__ auf Python 3.4

Sie versuchen, die Verbindung als Kontextmanager zu verwenden:

with conn:

Dieses Objekt implementiert nicht die notwendigen Methoden, um so verwendet zu werden; es ist kein Kontextmanager, da ihm (mindestens) der __exit__ Methode .

Wenn Sie ein Tutorial oder eine Dokumentation lesen, die eine andere MySQL-Bibliothek, beachten Sie, dass diese Funktion möglicherweise von einigen unterstützt wird Bibliotheken, nur nicht diese. Das MySQLdb-Projekt unterstützt es zum Beispiel.

Für Ihre spezifische In diesem Fall müssen Sie nicht einmal with conn: verwenden Linie überhaupt; Sie nehmen keine Änderungen an der Datenbank vor, es ist nirgendwo ein Commit erforderlich. Sie können den with conn: sicher entfernen Zeile (einrücken Sie alles darunter einen Schritt). Andernfalls können Sie den Kontextmanager durch ein manuelles conn.commit() ersetzen anderswo.

Alternativ können Sie Ihren eigenen Kontextmanager für diesen Anwendungsfall erstellen, indem Sie @contextlib.contextmanager() Dekorateur :

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()

und verwenden Sie dies als:

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

wo Sie zusätzliche Argumente für die connection.start_transaction() anrufen .