SQLAlchemy не будет обновлять мою базу данных
Я делаю приложение Pyramid с использованием SQLAlchemy-0.7.8. Я использую 64-битный Python3.2.
Вопрос в том, почему следующая функция ничего не передает в базу данных?
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
Я импортирую DBSession из другого скрипта. это определяется следующим образом:
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Вот некоторая справочная информация:
Приложение, которое я создаю, должно использоваться для характеристики больших блоков HTML с помощью регулярных выражений. Если приложение застревает и думает, что должно быть соответствие wilcard для фрагмента текста, тогда пользователю дается небольшая форма для заполнения. Как только форма зафиксирована, вызывается create_card. Если подстановочный знак сопоставляется со строкой, то создается экземпляр WildCard.
Класс WildCard не является чем-то особенным, он просто хранит строку и несколько целых чисел. Если я распечатаю dCard, похоже, что WildCard был успешно зафиксирован, потому что у него целочисленный идентификатор. Если я не вызываю flush в сеансе базы данных, тогда dCard ['id' '] - None.
поле id выглядит следующим образом:
id = Column(Integer,Sequence('wild_seq'), primary_key=True)
Строки add и flush приводят к следующему выводу консоли:
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)
Так что до этого момента все ведет себя довольно хорошо, как и ожидалось.
Вот проблема: Несмотря на то, что экземпляр WildCard выглядит так, как будто он был зафиксирован в базе данных, и никаких исключений не возникает, непосредственное изучение базы данных показывает, что никаких изменений не сделано.
замена flush () на commit () вызывает следующее исключение:
AssertionError: Transaction must be committed using the transaction manager