我想为了整洁,我会提出一个不同的问题。它基于: SQLAlchemy 不会更新我的数据库和SQLAlchemy 会话:如何保持活动状态?.
所以这是交易:我有一个 Pyramid 应用程序正在与一个守护进程对话,而后者又与一个数据库对话。
现在由于某种原因,当我将它添加到数据库会话变量时,它没有被提交到数据库中,如下所示:
DBSession.add(ModelInstance)
调用 flush 或 commit 不会使其提交。
这就是我制作 DBSession 的方式:
settings = {
'sqlalchemy.url':'blah blah'
}
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
engine = engine_from_config(settings, 'sqlalchemy.')
DBSession.configure(bind=engine)
这对我来说似乎很好,因为我可以很好地查询数据库。即:这种事情有效:
DBSession.query(ModelClass).get(id)
这位好先生https://stackoverflow.com/users/100297/martijn-pieters建议使用以下代码:
import transaction
transaction.commit()
这可以很好地确保我的东西得到承诺。唯一的问题是它以某种方式使我的 DBSession 无用。因此,如果我想使用我的会话正在跟踪的对象,我需要重新实例化会话和这些项目。这很糟糕。它占用了大量的时间。
我的问题是,简而言之,我该如何避免这种情况?
长篇大论:
- 如何让我的 DBSession 正确提交而不破坏它?
或者
- 如何在不需要冗长的数据库调用的情况下修复我的 DBSession 和关联的模型实例?
和
- 知道为什么会这样吗?我已经在我提到的 Pyramid 应用程序中以相同的方式成功地构建了一个 DBSession,它工作得非常好,它在我想要它的时候就提交了。
具体我遇到的错误可以参考我开头提到的两个问题