模型和实例方法:会话感知(sqlalchemy)

blu*_*ank 15 python 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
Run Code Online (Sandbox Code Playgroud)

也许这个问题应该标题为"让实例会话意识到所以我并不总是明确地管理它",如果这是一个愚蠢的问题,至少告诉我为什么用例子并指出我其他人要求更好的地方.

编辑:显然,导入我正在使用作品的会话,它是可用的,所以也许它是一个非问题或未来的,当我更熟练的sqlalchemy.

van*_*van 26

您的问题很常见,答案就在SA文档的会话常见问题中:

  • 如何获取特定对象的会话?使用Session上可用的object_session()类方法:
    session = Session.object_session(someobject)

但是,它假定对象是持久的并且是新的(但已添加到会话中)或绑定到会话.您的示例代码包含将对象添加到会话的逻辑,因此在这种情况下我的假设可能不正确.

  • 为了完整性:`from sqlalchemy.orm import Session` (2认同)

use*_*246 9

请参阅如何获取特定对象的会话?:

  • 谁能解释这两者之间的区别? (3认同)
  • 你不需要调用 `Session.object_session`,你可以只导入 `object_session` 本身,它是同一模块中的非类方法 (2认同)