SQLAlchemy仅加载集合,而不会在加载时反向引用

Dra*_*mon 4 sqlalchemy eager-loading

例如(eagerload / joinedload做同样的事情):

session = Session()    
parents = session.query(Parent).options(joinedload(Parent.children)).all()
session.close()

print parents[0].children  # This works
print parents[0].children[0].parent  # This gives a lazy loading error
Run Code Online (Sandbox Code Playgroud)

在关闭会话之前可以添加以下循环(并且不会影响数据库):

for p in parents:
  for c in p.children:
    c.parent
Run Code Online (Sandbox Code Playgroud)

真是愚蠢。有没有一种方法可以更改原始查询,以便在不增加输出SQL中添加更多联接的情况下加载关系的两端?

更新(如果相关);这是映射

class Parent(Entity):
  __tablename__ = "parent"

  id = Column(Integer, primary_key=True)
  children = relation("Child", backref="parent")

class Child(Entity):
  __tablename__ = "child"

  id = Column(Integer, primary_key=True)
  parentId = Column(Integer, ForeignKey("parent.id"), index=True)
Run Code Online (Sandbox Code Playgroud)

Den*_*ach 5

那就是contains_eager()选择的目的。请尝试以下操作:

parents = session.query(Parent).options(joinedload(Parent.children),
                                        contains_eager('children.parent')).all()
Run Code Online (Sandbox Code Playgroud)