Краткий ответ «Повлият ли грязные атрибуты на session.query
»: нет , как указано в «Является ли сеанс кэшем?» :
Однако он не выполняет никакого кеширования запросов.Это означает, что если вы скажете session.query(Foo).filter_by(name='bar')
, даже если Foo(name='bar')
прямо там, на карте идентичности, сессия не имеет об этом никакого представления.Он должен выдать SQL в базу данных, вернуть строки обратно, а затем, когда он увидит первичный ключ в строке, , а затем , он может просмотреть локальную карту идентификации и увидеть, что объект уже существует.
На практике это не так просто, поскольку в конфигурации по умолчанию SQLAlchemy периодически сбрасывает изменения, хранящиеся в Session
, в базу данных.Это известно как autoflush , и оно гарантирует, что запросы, отправленные в базу данных, отслеживают состояние, которое содержится в Session
.
В "Что делает Сессия?« также указано, что
Он предоставляет точку входа для получения объекта Query
, который отправляет запросы в базу данных с использованием текущей базы данных объекта Session
connection,
Таким образом, если вы отключили автоматическую очистку или находитесь в контексте, где очистка не может произойти, вам придется вручную обрабатывать грязные объекты.