sqlalchemy - SQLAlchemy 可以缓存更新吗
问题描述
我想使用 SQLalchemy 使用 ORM 接口更新可能很大的表中的行。但我不清楚一些事情。
我的问题是,假设我有一个会话进行重复选择和一些更新,这些更新是发生在数据库中还是有时缓冲在某个 ORM 缓存对象中?
例如,如果我重复一个产生 10 行的会话的选择,如下所示:
session.query('User').filter(User.val == 42, User.surname == 'Dent')
..但我只更新那 10 行的最后一行,
- ORM 是否总是从数据库中获取相同的 10 行,还是会使用缓存值?
- 任何缓存行为都会随着事务标记而改变吗?
解决方案
目前尚不清楚“使用缓存值进行更新”是什么意思,但我将尝试概述一般行为:
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 = ...
)。
推荐阅读
- angular - 如何使用 ActiveReportJS 在 Angular 代码中添加数据源和数据集
- angular - Mat-checkbox :- 单击它会选择所有
- c - 如何在 C 中正确使用 malloc?
- javascript - 如何解决隐藏文本,在滚动页脚上隐藏 React 中的正文文本
- java - Android Studio 活动未链接
- node.js - Express API:错误 [ERR_HTTP_HEADERS_SENT]
- angular - 在 Angular 中使用复选框进行计算
- azure-application-insights - 测试应用程序洞察力的显着变化
- reactjs - 使用 forwardRef 并在函数组件中连接“函数组件不能被赋予 refs”
- reactjs - 为什么 npm start 在反应应用程序中不起作用?