SQLAlchemy中synchronize_session参数的作用是什么?
SQLAlchemy synchronize_session 参数详解
这个参数的核心作用是解决批量操作时,Session内存缓存和数据库实际数据不一致的问题。
SQLAlchemy 的 Session 会把已经加载过的 ORM 对象缓存在内存中做身份映射,当你调用 query.delete() 或者 query.update() 这类批量操作方法时,操作是直接生成 SQL 语句在数据库层面执行的,默认不会自动更新内存中已经存在的 Session 缓存,synchronize_session 就是用来控制同步缓存逻辑的开关,一共有三个可选值:
synchronize_session=False
完全不做内存同步,执行完数据库批量操作后不对Session内的缓存做任何修改。是性能最高的选项,仅适合你确定当前Session从来没有加载过符合操作条件的对象、且操作完成后很快就会关闭Session的场景,否则后续操作缓存里的过期对象会出现数据错乱问题。synchronize_session="fetch"
执行批量操作前,先按照你写的过滤条件到数据库查询一次符合条件的主键,再把Session中对应主键的缓存对象移除,之后再执行数据库层面的批量操作。是最稳妥的选项,无论过滤条件多复杂都能正常工作,缺点是多了一次查询请求,会有轻微性能损耗。synchronize_session="evaluate"
这是参数的默认值,执行批量操作前不会查询数据库,而是直接在当前Session的已有缓存里,用你写的过滤条件做内存层面的筛选,把匹配到的缓存对象移除后再执行数据库操作。性能介于前两个选项之间,缺点是只支持简单的过滤条件,如果你的过滤逻辑用到了数据库专属函数、子查询等无法在Python内存中模拟计算的逻辑,会直接抛出异常。
示例说明
假设你已经提前执行过查询加载了目标对象:
# 此时squidward对应的User对象已经存入Session缓存 u = session.query(User).filter(User.name == "squidward").first()
如果你接下来执行不带同步的删除:
session.query(User).filter(User.name == "squidward").delete(synchronize_session=False)
数据库里这条记录已经被删除,但内存里的u对象仍然存在,你如果后续修改u的属性提交,就会产生不符合预期的错误。如果你使用fetch或者evaluate参数,删除后u会被自动从Session缓存中移除,避免后续操作异常。
内容的提问来源于stack exchange,提问作者yippee
相关产品推荐
相关产品推荐

