我有一个 Pyramid Web 应用程序,其中包含一些从数据库读取数据并写入数据的表单页面。
该应用程序将 SQLAlchemy 与 PostgreSQL 数据库一起使用,这是我设置 SQLAlchemy 会话的方式:
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
from zope.sqlalchemy import ZopeTransactionExtension
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
当我处理一个表单时,我需要执行一个包含在 a 中的显式提交,try
并查看该提交是否有效。我需要这个显式提交,因为我在 PostgreSQL 数据库中有可延迟的触发器(在提交时执行的检查),并且在某些情况下,没有错误是不可预测的。
一旦我成功提交了一个事务,例如添加一个 MyClass 的实例,我想获得这个实例的一些属性以及链接实例的一些属性。事实上,在提交之前我无法获取这些数据,因为它们是由数据库本身计算的。
我的问题是,当我使用transaction.commit()
(在transaction
包中)时,会话会自动关闭,我不能再使用该实例,因为它处于分离状态。文件证实了这一点。
因此,如文档中所述,我尝试使用以下会话设置:
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension(keep_session=True)))
但是,现在会话范围不再与 http 请求范围相同:在我的仅执行读取查询的 http 请求结束时不会发送 ROLLBACK。
那么,有没有办法让会话与 http 请求具有相同的范围但在提交时不会自动关闭?