SQLAlchemy aktualisiert meine Datenbank nicht

Ich erstelle eine Pyramid-App mit SQLAlchemy-0.7.8. Ich benutze 64bit Python3.2.

Die Frage ist, warum die folgende Funktion nichts in die Datenbank schreibt.

def create_card(sText,sCard):
    """
    create a wildcard instance if all is well (ie,sCard match in sText)
    return 
        oCard, dCard
    otherwise return False,False
    """
    oMatch = re.search(sCard,sText)
    if oMatch:
        oCard = WildCard()
        #set up some stuff about the WildCard

        DBSession.add(oCard)
        DBSession.flush()
        dCard = {
                    'id'            : oCard.id,
                    'span'          : oMatch.span(),
                    'card'          : oCard.card_string,
                            }
        return oCard,dCard
    return False,False  

Ich importiere DBSession aus einem anderen Skript. es ist wie folgt definiert:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

Hier einige Hintergrundinformationen:

Die App, die ich mache, soll verwendet werden, um große HTML-Blöcke mithilfe regulärer Ausdrücke zu charakterisieren. Wenn die App stecken bleibt und der Meinung ist, dass eine Wilcard-Übereinstimmung für einen Text vorhanden sein sollte, erhält der Benutzer ein kleines Formular zum Ausfüllen. Sobald das Formular festgeschrieben ist, wird create_card aufgerufen. Wenn der Platzhalter mit der Zeichenfolge übereinstimmt, wird eine WildCard-Instanz erstellt.

Die WildCard-Klasse ist nichts Besonderes, sie speichert nur einen String und ein paar Ganzzahlen. Wenn ich eine dCard ausdrucke, sieht es so aus, als ob die WildCard erfolgreich festgeschrieben wurde, weil sie eine Ganzzahl-ID hat. Wenn ich in der Datenbanksitzung kein Flush anrufe, ist dCard ['id'] None.

Das ID-Feld sieht folgendermaßen aus:

id = Column(Integer,Sequence('wild_seq'), primary_key=True)

Die Hinzufügungs- und Leerzeilen verursachen die folgende Konsolenausgabe:

2012-09-16 12:30:34,845 INFO  [sqlalchemy.engine.base.Engine][Dummy-2] INSERT INTO wildcard_wildcards (card_string, range_id, brand_id, category_id, group_cat_map_id, heading_group_id, heading_to_grp_map_id, heading_id, value_map_id, igneore_match) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2012-09-16 12:30:34,845 INFO  [sqlalchemy.engine.base.Engine][Dummy-2] ('sCard contents', None, None, None, None, None, None, None, None, 0)

Also bis zu diesem Punkt verhält sich alles ziemlich wie erwartet.

Hier ist das Problem: Auch wenn die WildCard-Instanz so aussieht, als ob sie für die Datenbank festgeschrieben wurde und keine Ausnahmen ausgelöst wurden, zeigt eine direkte Untersuchung der Datenbank, dass keine Änderungen vorgenommen wurden.

Das Ersetzen von flush () durch commit () löst die folgende Ausnahme aus:

AssertionError: Transaction must be committed using the transaction manager

Antworten auf die Frage(1)

Ihre Antwort auf die Frage