首页 > 解决方案 > SQLAlchemy 可以缓存更新吗

问题描述

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

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

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

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

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

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

标签: sqlalchemy

解决方案


目前尚不清楚“使用缓存值进行更新”是什么意思,但我将尝试概述一般行为:

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查询,并且(默认情况下)使身份映射中的所有实例过期,以便user.surname此时发出SELECT查询(但仅针对该行,即SELECT ... WHERE id = ...)。


推荐阅读