插入不适用于 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 数据库会话的主要内容,如果未能解决你的问题,请参考以下文章
ON_DELETE="CASCADE" 不适用于 flask-sqlalchemy
flask-restless validation_exceptions 不适用于 flask-sqlalchemy 模型中的少数列
在 SQLAlchemy 中处理插入时重复的主键(声明式样式)
使用 FastAPI 的异步 SqlAlchemy:获取所有请求的单个会话
NSURLSessionConfiguration timeoutIntervalForRequest 似乎不适用于后台会话