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