SQLAlchemy загружает только коллекцию, а не обратную ссылку при загрузке - PullRequest
3 голосов
/ 21 июля 2010

Например (eagerload / joinload делают то же самое):

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

Добавление следующего цикла перед закрытием сеанса работает (и не попадает в БД):

for p in parents:
  for c in p.children:
    c.parent

Что довольно глупо.Есть ли способ изменить исходный запрос, чтобы он загружал обе стороны отношения без добавления дополнительных объединений в выходной SQL?

update В случае, если это актуально;вот карта

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)

1 Ответ

4 голосов
/ 14 сентября 2010

Вот для чего нужна опция contains_eager(). Попробуйте следующее:

parents = session.query(Parent).options(joinedload(Parent.children),
                                        contains_eager('children.parent')).all()
...