Кэширование объектов SQLAlchemy за пределами транзакции - PullRequest
1 голос
/ 02 апреля 2012

По соображениям производительности наше приложение загружает определенные экземпляры модели SQLAlchemy в память во время запуска.Ожидается, что эти экземпляры не изменятся в течение срока службы приложения, поэтому это разумное решение.

По большей части это было нормально, но я наблюдал отдельные случаи, когда появится DetachedInstanceError: Instance <ZZZ at 0x3a23510> is not bound to a Session; attribute refresh operation cannot proceed, вызывая текущие проблемы.Это та же самая ошибка, которую я (как и ожидалось) получал бы при попытке доступа к отношениям с отложенной загрузкой для аналогично кэшированного объекта.

Эта ошибка, по-видимому, вызвана доступом к атрибуту .id, который я ожидаюне требовать какого-либо обновления БД для доступа.Что меня действительно беспокоит, так это то, что я не могу последовательно воспроизвести это исключение.

Мой вопрос заключается в том, что может вызвать это исключение и какие методы кто-либо использовал для хранения экземпляров SQLAlchemy за пределами транзакции, которая их привела?

1 Ответ

2 голосов
/ 03 апреля 2012

.id будет отсутствовать, если срок действия объекта истек до того, как он был помещен в кэш.После того, как сеанс фиксируется или откатывается, по умолчанию у него истекают все атрибуты, которые обновляются при следующем доступе.

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

Решение состоит в том, чтобы кэшировать ваш объект до истечения срока его действия, удалить его из сеанса до истечения срока действия сеанса или отключить expire_on_commit.

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