2010-07-21 2 views
3

Например (eagerload/joinedload сделать то же самое):SQLAlchemy только загружает коллекцию, не backref когда eagerloading

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?

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

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) 

ответ

4

Это то, что contains_eager() вариант предназначен для. Попробуйте следующее:

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