2009-12-29 9 views
1

J'ai trois tables (utilisateurs, articles et balises) définies dans SQLAlchemy et mappées avec orm.mapper(). Comme vous pouvez le voir ci-dessous, j'ajoute une propriété "auteur" à chaque article qui lie cet article à l'utilisateur qui l'a créé.Récupération des propriétés ORM avec SQLAlchemy

orm.mapper(User, t_users) 
orm.mapper(Tag, t_tags) 
orm.mapper(Article, t_articles, properties={ 
    'author' : orm.relation(User), 
    'tags' : orm.relation(Tag, secondary=t_tags_articles), 
    }) 

Je liste un index d'articles, et chaque article devra montrer ses étiquettes et son auteur. J'essaie de trouver le meilleur moyen (requêtes SQL minimales, meilleures performances) pour récupérer les données de l'auteur et des tags.

Si je fais ceci:

results = Session.query(Article).all() 

alors je peux tirer l'auteur et des étiquettes pour chaque article dans l'indice comme celui-ci:

author = results[0].author 
tags = results[0].tags 

mais gère deux nouvelles requêtes pour chaque résultat [ x] que je boucle (yikes). Si je fais ceci:

results = Session.query(Article, User).join('author').all() 

alors je peux accéder aux données de l'auteur comme celui-ci (parce qu'il est entré dans):

firstname = results[0].firstname 

mais en essayant d'obtenir une liste des balises ne fonctionne pas, et au lieu soulève un AttributeError (objet « » rowTuple n'a pas d'attribut « tags »):

tags = results[0].tags 

Qu'est-ce que je fais mal, et ce qui est la meilleure façon d'accéder aux données pour cet indice?

Répondre

3

Considéré avec chargement, comme couvert par Working with Related Objects?

Votre jointure est également funky. Vous mélangez l'ORM avec la boîte à outils SQL, de sorte que vous récupérez des objets de ligne et non des objets mappés. Voir Querying with Joins

+0

Merci. C'est exactement ce dont j'avais besoin. – Travis

Questions connexes