2010-07-21 15 views
3

Par exemple (eagerload/joinedload faire la même chose):SQLAlchemy charge seule collection, non backref quand 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 

Ajout de la boucle suivante avant de fermer les travaux de la session (et ne touche pas le DB):

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

Ce qui est assez bête. Existe-t-il un moyen de modifier la requête d'origine afin qu'elle charge les deux côtés de la relation sans ajouter plus de jointures dans le SQL de sortie?

mise à jour Dans le cas où c'est pertinent; voici le mappage

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) 

Répondre

4

C'est ce que propose l'option contains_eager(). Essayez ce qui suit:

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