SQLAlchemy不会更新我的数据库

She*_*ena 12 python sqlalchemy pyramid python-3.2

我正在使用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  
Run Code Online (Sandbox Code Playgroud)

我从另一个脚本导入DBSession.它的定义如下:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Run Code Online (Sandbox Code Playgroud)

这是一些背景信息:

我正在制作的应用程序用于通过使用正则表达式来表征大块HTML.如果应用程序卡住并且认为应该为一段文本匹配wilcard,那么将为用户提供一个小表格来填写.一旦表单被提交,就会调用create_card.如果通配符与字符串匹配,则创建WildCard实例.

WildCard类没有什么特别之处,它只存储一个字符串和一些整数.如果我打印出dCard,看起来WildCard已经成功提交,因为它有一个整数id.如果我没有在数据库会话上调用flush,则dCard ['id']为None.

id字段如下所示:

id = Column(Integer,Sequence('wild_seq'), primary_key=True)
Run Code Online (Sandbox Code Playgroud)

添加和刷新行会导致以下控制台输出:

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)
Run Code Online (Sandbox Code Playgroud)

所以直到这一点,一切都表现得像预期的那样漂亮.

问题在于:尽管WildCard实例看起来已经提交到数据库,并且没有引发异常,但直接检查数据库显示没有进行任何更改.

使用commit()替换flush()会引发以下异常:

AssertionError: Transaction must be committed using the transaction manager
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 24

您需要提交您的交易.

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

如果您ZopeTransactionExtension在会话制作者中使用扩展名,后者仅为SQLAlchemy提交事务:

from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Run Code Online (Sandbox Code Playgroud)

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

transaction.commit()
Run Code Online (Sandbox Code Playgroud)

  • 这给了我:AssertionError:必须使用事务管理器提交事务. (2认同)
  • 使用线程可能会在调用transaction.commit()时收到DetachedInstanceError.这可能是因为您在"with transaction.manager:"块中没有事务代码,这是我的问题. (2认同)