Непонятно, что вы подразумеваете под «использовать кэшированные значения для обновлений», но я постараюсь описать общее поведение:
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 = ...
).