【发布时间】:2015-06-03 00:12:25
【问题描述】:
一点背景:
我正在使用pyramid 框架和SQLAlchemy。我的数据库会话由 pyramid_tm 和 ZTE 处理
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
我有一个非常复杂的数据库设计,其中包含大量模型类、外键以及模型之间的复杂关系。
因此,在我的模型上执行一些非常复杂的逻辑以及从不同模型中的关系中删除、更新、插入和移动对象时,我曾经随机获得IntegrityError,这将在重新启动pserve 后消失。
这很奇怪,因为autoflush 已打开,理论上会话必须在我更改模型上的任何内容后立即刷新。
所以我对随机IntegrityError 的解决方案是在事情变得非常复杂时手动刷新我的逻辑中的会话。
自从我在我的逻辑中执行了DBSession.flush() 之后,我再也没有收到 IntegrityError。
问题
现在我有两个问题:
-
为什么 autoflush 不能防止完整性错误?是不是 autoflush 不清理模型,而
DBSession.flush()清理模型? -
在我的代码中调用
DBSession.flush()是否有任何副作用?我真的想不出任何副作用(除了调用 DB 的性能开销很小)。我不太喜欢在我的代码中调用DBSession.flush(),因为它确实必须由框架处理。
另见
谢谢。
【问题讨论】:
-
你能分享
IntegrityError那是throw的完整消息吗? -
这里还有一点需要注意的是
flush会将数据写入数据库,但是除非你使用commit,否则更改不会存储到数据库中,它们将被丢弃会话到期。如果您调用commit,则会刷新更改并使其持久化。 -
谢谢阿达什。我的问题是在代码中手动调用flush而不是让框架处理它是否有任何副作用。
-
这样没有副作用。但在我看来,只有在禁用自动刷新以防止混淆时,您才应该这样做。实际上,我建议不要使用 autoflush 并手动进行刷新和提交,因为这样可以更好地控制处理错误、如何回滚以及根据查询的方式优化对数据库的写入。
-
@adrash: docs.sqlalchemy.org/en/latest/orm/…
标签: python sqlalchemy pyramid flush