如果在 SQLAlchemy 中有以下 ORM 设置:
class Foo(Base):
id = Column(Integer, primary_key=True)
status = Column(String)
barId = Column(Integer, ForeignKey("bar.id"))
bar = relationship("Bar", lazy="joined")
class Bar(Base):
id = Column(Integer, primary_key=True)
因此,我希望始终为每个 Foo 对象提供关联的 Bar 对象。我经常从会话中分离 Foo 对象并继续使用它的值和 Bar 的值。有时我需要更新 Foo 的状态字段。在这种情况下,我创建一个新会话,将 foo 对象添加到会话并提交它。提交后,与 Foo 对象关联的 Bar 对象无效,但不会通过提交对 Foo 对象的隐式刷新重新加载。再次从会话中分离 Foo 对象后,Bar 对象不再可用。我发现解决这个问题的唯一方法是在提交 foo 之后显式地加载 bar 对象。
示例工作流程:
session = Session()
foo = session.query(Foo).get(id) <-- foo.bar is automatically eager loaded
session.close()
....
session = Session()
session.add(foo)
foo.status = 'done'
session.commit() <-- foo is commited and refreshed, foo.bar is not
session.refresh(foo) <-- same here, foo.bar is not loaded
#foo.bar <-- only explicit eager loading foo.bar here works
session.close()
....
foo.bar <-- error if not explicitly eager loaded
我想将此设置用于一些类似 Bar 的小对象。要求我记住始终显式地重新加载 foo.bar 对象很容易出错。所以我的问题是:我是否可以在所有情况下都急切地加载 foo.bar,无论是查询()、提交()(隐式刷新)还是(显式)刷新()?