SQLAlchemy不会更新我的数据库

2024-05-15 14:55:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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

Tags: noneid数据库false应用程序returncard通配符
1条回答
网友
1楼 · 发布于 2024-05-15 14:55:57

您需要提交您的事务。

您可以显式地执行此操作(通过调用DBSession.commit()或使用^{} middleware;后者在成功响应时自动提交事务(使用2xx HTTP响应)。

后者仅在与会话生成器一起使用ZopeTransactionExtension扩展时提交SQLAlchemy事务:

from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

如果您已经在使用ZopeTransactionExtension并希望显式提交事务,则需要使用transaction包: 进口交易

transaction.commit()

相关问题 更多 >