【问题标题】:Insert not working for SQLAlchemy database session插入不适用于 SQLAlchemy 数据库会话
【发布时间】:2014-01-30 06:38:05
【问题描述】:

为什么没有插入记录?返回了一个 id 但是当我检查数据库时没有新记录。

来自 models.py

from zope.sqlalchemy import ZopeTransactionExtension

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

还有 views.py

DBSession.execute(text('INSERT INTO (a,b,c) VALUES (\'a\',\'b\',\'c\') RETURNING id'), params=dict(a=a,b=b,c=c))

我尝试使用transaction.commit() 提交,它没有收到错误但没有插入记录。 result.fetchone()[0] 正在获取一个 ID。

DBSession.commit 得到

assert self.transaction_manager.get().status == ZopeStatus.COMMITTING, "Transaction must be committed using the transaction manager"

【问题讨论】:

    标签: python sqlalchemy pyramid pylons


    【解决方案1】:

    这是因为您没有使用 ORM 插入新行,因为事务不知道它应该自行提交,因为事务状态未标记为脏。

    在您的views.py 中DBSession.execute 查询之后放置以下代码。

    from zope.sqlalchemy import mark_changed
    session = DBSession()
    session.execute(...your query...)
    mark_changed(session)
    

    此时事务应该能够正确提交您的查询,或者使用 ORM 插入新行。

    这里有更多关于这个主题的内容:

    https://pypi.python.org/pypi/zope.sqlalchemy/0.7.4#id15

    默认情况下,zope.sqlalchemy 在首次使用会话时会将会话置于“活动”状态。 ORM 写入操作会自动将会话移动到“已更改”状态。这避免了不必要的数据库提交。有时需要直接通过 SQL 与数据库进行交互。无法猜测这样的操作是读还是写。因此,当手动 SQL 语句写入数据库时​​,我们必须手动将会话标记为已更改。

    【讨论】:

    • 嗯,使用 mark_changed(DBSession) 'scoped_session' 出现错误:对象没有属性 'twophase'
    • 我正在考虑只使用自动提交
    • 尝试做这样的事情:session = DBSession()session.execute(...)mark_changed(session) 因为你需要使用你的实际会话而不是会话制造者——我正在改变我的初始响应以显示它应该是什么样子。
    • 嘿@amiawizard 我已经更新了使用实际会话的响应,以免让您感到困惑 - 我正在查看我的应用程序代码,我相信这现在可以工作了。
    【解决方案2】:

    试试

    DBSession.flush()
    

    执行后

    【讨论】:

      猜你喜欢
      • 2019-05-02
      • 2018-03-15
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多