Модель и методы экземпляра: session aware (sqlalchemy)
Итак, использование и обучение с помощью sqlalchemy.
У меня есть экземпляр, мне нужно получить значение. Если это значение существует, верните его.
Если не рассчитать и не вернуть его.
Неизменно кто-то скажет: "Вы делаете это неправильно", а вклад в улучшение оценивается в целом.
Однако я изучаю, как я могу это сделать без явного управления сеансом, потому что то, над чем я работаю, начинает расти, и постоянное управление сеансом, когда я хочу обновить экземпляр, проблематично. Это заставляет меня думать, что я на самом деле делаю это неправильно.
Итак, как мне исправить описанный ниже метод, чтобы не управлять сеансом явно?
def method(self, session):
if self.i_needed_this is None:
self.i_needed_this = calculate(calcutron)
session.add(self)
session.commit()
return self.i_needed_this
else:
return self.i_needed_this
Может быть, этот вопрос должен быть озаглавлен "создание сеанса сеанса, поэтому я не всегда явно его управляю", и если это глупый вопрос, по крайней мере, покажите мне, почему с примерами и укажите мне, где другие попросили лучше.
Изменить: по-видимому, импортировать сеанс, который я использую, и он доступен, поэтому, возможно, это не проблема или будущий, когда я буду более опытным с sqlalchemy.
Ответы
Ответ 1
Ваш вопрос настолько распространен, что ответ на него находится в Session Frequently Asked Questions документации SA:
- Как я могу получить сеанс для определенного объекта?
Используйте object_session() classmethod, доступный на сеансе:
session = Session.object_session(someobject)
Однако он предполагает, что объект является постоянным и является либо новым (но добавленным к сеансу уже), либо привязан к сеансу. В вашем примере кода содержится логика для добавления объекта в сеанс, поэтому мое предположение может быть неверным в этом случае.
Ответ 2
См. Как я могу получить сеанс для определенного объекта?:
-
Вы можете использовать API проверки работоспособности SA:
from sqlalchemy import inspect
# ...
# within instance method
session = inspect(self).session
-
или object_session()
:
from sqlalchemy.orm.session import Session
# ...
# within instance method
session = Session.object_session(self)