SQLAlchemy可以缓存更新吗

SQLAlchemy可以缓存更新吗,sqlalchemy,Sqlalchemy,我想使用SQLalchemy使用ORM接口更新一个可能很大的表中的行。但我有点不清楚 我的问题是,假设我有一个会话进行重复选择和一些更新,这些更新是发生在数据库中还是有时缓冲在某个ORM缓存对象中 例如,如果我正在使用一个会话重复一个select,该会话将产生10行,如下所示: session.query('User').filter(User.val == 42, User.surname == 'Dent') 。。但我只更新了那10行的最后一行 ORM总是从DB中获取相同的10行还是使用缓

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

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

例如,如果我正在使用一个会话重复一个select,该会话将产生10行,如下所示:

session.query('User').filter(User.val == 42, User.surname == 'Dent')
。。但我只更新了那10行的最后一行

  • ORM总是从DB中获取相同的10行还是使用缓存的值
  • 任何缓存行为是否会随事务标记而改变

  • 现在还不清楚“使用缓存值进行更新”是什么意思,但我将尝试概括一下一般行为:

    query = session.query(User).filter(...)
    
    这对数据库没有任何作用。这构造了一个表示查询的
    查询对象

    users = query.all()
    # or
    for user in query:
        ...
    
    这将始终执行
    SELECT
    查询,从数据库中获取行,将它们转换为内存中的对象,并将它们放入标识映射中。(这可能就是您所说的缓存。)

    这记录了您想要将
    姓氏
    列更新为
    “Bar”
    ,但实际上对数据库没有任何作用

    session.flush()
    
    session.commit()
    
    这将向数据库发出
    UPDATE
    查询

    session.flush()
    
    session.commit()
    
    如果有任何挂起的更改,将进行刷新,发出一个
    COMMIT
    查询,并且(默认情况下)将终止标识映射中的所有实例,以便执行
    user.namite
    此时发出一个
    SELECT
    查询(但仅针对该行,即
    SELECT…WHERE id=…