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
.