在代码中调用SQLAlchemy flush()是否有任何副作用?

时间:2015-03-30 04:28:41

标签: python sqlalchemy pyramid flush

一些背景知识:

我正在使用pyramid框架SQLAlchemy。我的db会话由pyramid_tm和ZTE

处理
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

我有一个非常复杂的数据库设计,包含许多模型类,外键和模型之间的复杂关系。

因此,在我的模型上执行一些非常复杂的逻辑并删除,更新,插入和移动不同模型中的关系中的对象时,我曾经随机获得IntegrityError,这会在重新启动pserve之后消失

这很奇怪,因为autoflush已打开,理论会话必须在我更改模型上的任何内容后立即刷新。

所以我对随机IntegrityError的解决方案是在事情变得非常复杂的时候在我的逻辑中手动刷新会话。

由于我在逻辑中执行了DBSession.flush(),因此我无法获得IntegrityError。

问题

现在我有两个问题:

  1. autoflush如何防止完整性错误?是不是autoflush不清理模型,DBSession.flush()清理模型?

  2. 在我的代码中调用DBSession.flush()是否有任何副作用?我无法想到任何副作用(除了调用DB的性能开销很小)。我不太喜欢在我的代码中调用DBSession.flush(),因为它必须真正由框架处理。

  3. 另见

      

    When should I be calling flush() on SQLAlchemy?

    谢谢。

1 个答案:

答案 0 :(得分:0)

很难说为什么在没有看到任何代码的情况下过去常常获取IntegrityError,但理论上有一些情况autocommit可能导致通过过早地冲洗会话。例如:

COURSE_ID = 10
student = Student(name="Bob")
student.course_id = COURSE_ID

course = Course(id=COURSE_ID, name="SQLAlchemy")

上面的代码可能(尚未测试)在启用autocommit时失败,如果让SQLAlchemy刷新更改,则应该成功。

如果它有所帮助,我认为定期刷新会话没有任何损害,但同样,很难判断是否可以采取措施避免手动刷新而没有任何代码示例。