当我创建sqlalchemy会话并更改某些模型的某些属性时,在该会话上的任何query
或flush
之前进行commit
时,这些更改是否适用?
我找不到解决此状态的任何适当文档。
具体来说,当我尝试在模型创建/更新的事件侦听器中验证数据库不变式时遇到了这个问题。我知道我的session.dirty
中有脏模型,除了我制作的任何标准session.query()
之外,我还需要手动查询它们吗?
答案 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
对象的当前数据库连接将查询发送到数据库。
因此,如果您禁用了自动刷新功能,或者在无法进行刷新的情况下,则必须手动处理脏对象。