sql >> Database >  >> RDS >> Mysql

AttributeError:__exit__ op python 3.4

U probeert de verbinding te gebruiken als contextbeheerder:

with conn:

Dit object implementeert niet de noodzakelijke methoden om zo te worden gebruikt; het is geen contextmanager, omdat het (tenminste) de __exit__ methode .

Als je een tutorial of documentatie leest die een andere . gebruikt MySQL-bibliotheek, houd er rekening mee dat deze functie mogelijk wordt ondersteund door sommige bibliotheken, alleen deze niet. Het MySQLdb-project ondersteunt het bijvoorbeeld.

Voor uw specifieke geval hoeft u niet eens de with conn: . te gebruiken lijn helemaal; je brengt geen wijzigingen aan in de database, er is nergens een commit vereist. U kunt de with conn: regel (maak alles eronder één stap ongedaan). Anders kunt u de contextmanager vervangen door een handmatige conn.commit() elders.

Als alternatief kunt u uw eigen contextmanager voor deze use-case maken, met behulp van de @contextlib.contextmanager() binnenhuisarchitect :

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

en gebruik dit als:

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

waar je extra argumenten kunt invoeren voor de connection.start_transaction() bel .




  1. IS NULL en COALESCE gebruiken in OrderBy Doctrine Querybuilder

  2. Tel hoeveel rijen ingevoegd vanuit de laatste SQL-query

  3. Reeks vervangen door willekeurig getal

  4. Externe sleutelrelatie tussen twee databases toevoegen