插入不适用于 SQLAlchemy 数据库会话

Posted

技术标签:

【中文标题】插入不适用于 SQLAlchemy 数据库会话【英文标题】:Insert not working for SQLAlchemy database session 【发布时间】: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"

【问题讨论】:

【参考方案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()

执行后

【讨论】:

以上是关于插入不适用于 SQLAlchemy 数据库会话的主要内容,如果未能解决你的问题,请参考以下文章

PHP会话不适用于多个WordPress页面

ON_DELETE="CASCADE" 不适用于 flask-sqlalchemy

flask-restless validation_exceptions 不适用于 flask-sqlalchemy 模型中的少数列

在 SQLAlchemy 中处理插入时重复的主键(声明式样式)

使用 FastAPI 的异步 SqlAlchemy:获取所有请求的单个会话

NSURLSessionConfiguration timeoutIntervalForRequest 似乎不适用于后台会话