我正在使用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匹配的一段文字,然后给用户一个小表格来填写。一旦提交表单,将调用创建卡。如果通配符与字符串匹配,则创建通配符实例。
通配符类没有什么特别的,它只存储一个字符串和几个整数。如果我打印出dCard,则通配符似乎已成功提交,因为它具有整数id。如果我在数据库会话中不调用flush,则dCard['id']为None。
id字段如下所示:
id = Column(Integer,Sequence('wild_seq'), primary_key=True)
添加和刷新行导致以下控制台输出:
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)
所以到目前为止,一切都如预期般美好。
问题是: 尽管通配符实例看起来已经提交给数据库,并且没有引发异常,但是对数据库的直接检查表明没有进行任何更改。
将flush()替换为commit()会引发以下异常:
AssertionError: Transaction must be committed using the transaction manager
您需要提交您的事务。
您可以显式地执行此操作(通过调用} middleware ;后者在成功响应时自动提交事务(使用2xx HTTP响应)。
DBSession.commit()
或使用^{后者仅在与会话生成器一起使用
ZopeTransactionExtension
扩展时提交SQLAlchemy事务:如果您已经在使用
ZopeTransactionExtension
并希望显式提交事务,则需要使用transaction
包: 进口交易相关问题 更多 >
编程相关推荐