Повлият ли грязные атрибуты на session.query - PullRequest
0 голосов
/ 25 сентября 2018

Когда я создаю сеанс sqlalchemy и изменяю некоторые свойства какой-либо модели, будут ли применяться эти изменения при создании query перед любым flush или commit в сеансе?

Я не могнайти любую надлежащую документацию, касающуюся этого состояния.

В частности, я сталкивался с этим при попытке проверить инварианты БД в модели созданного / обновленного прослушивателя событий.Я знаю, что у меня есть грязные модели в session.dirty, нужно ли мне запрашивать их вручную в дополнение к любым стандартным session.query(), которые я делаю?

1 Ответ

0 голосов
/ 26 сентября 2018

Краткий ответ «Повлият ли грязные атрибуты на session.query»: нет , как указано в «Является ли сеанс кэшем?» :

Однако он не выполняет никакого кеширования запросов.Это означает, что если вы скажете session.query(Foo).filter_by(name='bar'), даже если Foo(name='bar') прямо там, на карте идентичности, сессия не имеет об этом никакого представления.Он должен выдать SQL в базу данных, вернуть строки обратно, а затем, когда он увидит первичный ключ в строке, , а затем , он может просмотреть локальную карту идентификации и увидеть, что объект уже существует.

На практике это не так просто, поскольку в конфигурации по умолчанию SQLAlchemy периодически сбрасывает изменения, хранящиеся в Session, в базу данных.Это известно как autoflush , и оно гарантирует, что запросы, отправленные в базу данных, отслеживают состояние, которое содержится в Session.

В "Что делает Сессия?« также указано, что

Он предоставляет точку входа для получения объекта Query, который отправляет запросы в базу данных с использованием текущей базы данных объекта Sessionconnection,

Таким образом, если вы отключили автоматическую очистку или находитесь в контексте, где очистка не может произойти, вам придется вручную обрабатывать грязные объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...