脏属性会影响session.query吗

时间:2018-09-25 20:57:28

标签: python sqlalchemy

当我创建sqlalchemy会话并更改某些模型的某些属性时,在该会话上的任何queryflush之前进行commit时,这些更改是否适用?

我找不到解决此状态的任何适当文档。

具体来说,当我尝试在模型创建/更新的事件侦听器中验证数据库不变式时遇到了这个问题。我知道我的session.dirty中有脏模型,除了我制作的任何标准session.query()之外,我还需要手动查询它们吗?

1 个答案:

答案 0 :(得分:1)

"Is the Session a cache?"中所述,对“脏属性会影响session.query的简短回答是

  

但是,它不执行任何类型的查询缓存。这意味着,即使您说session.query(Foo).filter_by(name='bar'),即使Foo(name='bar')就在身份映射中,会话也对此一无所知。它必须向数据库发出SQL,返回行,然后当看到行中的主键时, then 可以在本地标识图中查看并发现对象已经存在

实际上并不是那么简单,因为SQLAlchemy在其默认配置中会定期将Session中保存的更改刷新到数据库中。这就是所谓的autoflush,它可以确保发给数据库的查询观察到Session中保存的状态。

"What does the Session do ?"中还指出

  

它提供了一个获取Query对象的入口点,该对象使用Session对象的当前数据库连接将查询发送到数据库

因此,如果您禁用了自动刷新功能,或者在无法进行刷新的情况下,则必须手动处理脏对象。