20

因此,使用和学习 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 时,它可能不是问题或未来的问题。

4

2 回答 2

32

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

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

于 2012-06-04T16:47:56.237 回答
15

请参阅如何获取某个对象的 Session?

  • 您可以使用 SA 运行时检查 API:

    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)
    
于 2014-03-27T14:46:19.190 回答