我正在使用 SQLAlchemy-0.7.8 制作一个 Pyramid 应用程序。我正在使用 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。如果应用程序卡住并认为一段文本应该有一个通配符匹配,那么用户会得到一个小表单来填写。一旦提交表单,就会调用 create_card。如果通配符与字符串匹配,则创建通配符实例。
WildCard 类没有什么特别之处,它只是存储一个字符串和几个整数。如果我打印出 dCard,它看起来好像 WildCard 已成功提交,因为它有一个整数 id。如果我不在数据库会话上调用刷新,则 dCard['id'] 为无。
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