我正在使用 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 = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
以下是一些背景信息:
我正在制作的应用程序将用于通过使用正则表达式来表征大块 HTML。如果应用程序卡住并认为一段文本应该有一个通配符匹配,那么用户会得到一个小表单来填写。提交表单后,将调用 create_card 。如果通配符与字符串匹配,则创建一个通配符实例。
WildCard 类没有什么特别的,它只是存储一个字符串和一些整数。如果我打印出 dCard ,看起来通配符已成功提交,因为它有一个整数 ID。如果我不在数据库会话上调用刷新,则 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 实例看起来已经提交到数据库,并且没有引发异常,但对数据库的直接检查表明没有进行任何更改。
用commit()替换flush()会引发以下异常:
AssertionError: Transaction must be committed using the transaction manager