SQLAlchemy nie zaktualizuje mojej bazy danych

Tworzę aplikację Pyramid przy użyciu SQLAlchemy-0.7.8. Używam 64-bitowego Pythona 3.2.

Pytanie brzmi, dlaczego poniższa funkcja nie zobowiązuje niczego do bazy danych?

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  

Importuję DBSession z innego skryptu. jest zdefiniowany w następujący sposób:

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

Oto kilka podstawowych informacji:

Aplikacja, którą tworzę, ma być używana do charakteryzowania dużych bloków HTML za pomocą wyrażeń regularnych. Jeśli aplikacja utknie i podejrzewa, że ​​powinna być zgodna z wilcard dla fragmentu tekstu, użytkownik otrzymuje mały formularz do wypełnienia. Po zatwierdzeniu formularza create_card jest wywoływany. Jeśli symbol wieloznaczny jest dopasowany do łańcucha, tworzona jest instancja WildCard.

Klasa WildCard to nic specjalnego, po prostu przechowuje ciąg i kilka liczb całkowitych. Jeśli wydrukuję dCard, wygląda na to, że WildCard został pomyślnie zatwierdzony, ponieważ ma identyfikator liczby całkowitej. Jeśli nie wezwę koloru w sesji bazy danych, dCard ['id'] to None.

pole identyfikatora wygląda następująco:

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

Linie dodawania i opróżniania powodują następujące wyjście konsoli:

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)

Aż do tego momentu wszystko zachowuje się całkiem zgodnie z oczekiwaniami.

Oto problem: nawet jeśli instancja WildCard wygląda tak, jakby została zatwierdzona w bazie danych i nie są zgłaszane wyjątki, bezpośrednie sprawdzenie bazy danych pokazuje, że nie wprowadzono żadnych zmian.

zastąpienie flush () poleceniem commit () powoduje następujący wyjątek:

AssertionError: Transaction must be committed using the transaction manager

questionAnswers(1)

yourAnswerToTheQuestion