所以,使用和学习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更熟练。
答案 0 :(得分:23)
您的问题非常常见,答案就在SA文档的Session Frequently Asked Questions中:
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)