我想使用SQLalchemy使用ORM接口更新可能很大的表中的行。但我不清楚某事。
我的问题是,假设我有一个会话重复选择和一些更新,这些更新是在数据库中发生还是有时在某些ORM缓存对象中缓冲?
例如,如果我重复一个选择,会话产生10行,如下所示:
session.query('User').filter(User.val == 42, User.surname == 'Dent')
..但我只更新那个10的最后一行,
答案 0 :(得分:1)
“使用缓存值进行更新”并不清楚您的意思,但我会尝试概述一般行为:
query = session.query(User).filter(...)
这对数据库没有任何作用。这会构造一个代表您的查询的Query
对象。
users = query.all()
# or
for user in query:
...
这将始终执行SELECT
查询以从数据库中获取行,将它们转换为内存中对象,并将它们放入标识映射中。 (这可能是缓存的意思。)
user = users[0]
user.surname = "Bar"
这记录了您要将surname
列更新为"Bar"
这一事实,但它实际上并未对数据库执行任何操作。
session.flush()
这会向数据库发出UPDATE
个查询。
session.commit()
此如果有任何待处理的更改则刷新,发出COMMIT
查询,并且(默认情况下)使身份地图中的所有实例失效,以便执行{ {1}}此时会发出user.surname
个查询(但仅针对该行,即SELECT
)。