Модель и методы экземпляра: 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)

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