SQLAlchemy可以缓存更新

时间:2018-05-01 14:05:31

标签: sqlalchemy

我想使用SQLalchemy使用ORM接口更新可能很大的表中的行。但我不清楚某事。

我的问题是,假设我有一个会话重复选择和一些更新,这些更新是在数据库中发生还是有时在某些ORM缓存对象中缓冲?

例如,如果我重复一个选择,会话产生10行,如下所示:

session.query('User').filter(User.val == 42, User.surname == 'Dent')

..但我只更新那个10的最后一行,

  1. ORM是否总是从DB中获取相同的10行,还是会使用缓存的值?
  2. 任何缓存行为都会随着事务标记而改变吗?

1 个答案:

答案 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)。