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

时间:2012-06-04 14:26:53

标签: 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

也许这个问题应该标题为“让实例会话知晓,所以我并不总是明确地管理它”,如果这是一个愚蠢的问题,至少告诉我为什么用例子,并指出我更好的问题。< / p>

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

2 个答案:

答案 0 :(得分:23)

您的问题非常常见,答案就在SA文档的Session Frequently Asked Questions中:

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

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

答案 1 :(得分:7)

请参阅How can I get the Session for a certain object?

  • 您可以使用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)