2009-05-19 3 views
2

J'utilise Turbogears2 et SQLAlchemy pour développer une application web. J'ai deux tables mappées O1 et O2. O2 a une liste triée des O1 dans 'uns'. À un moment donné, je veux interroger tous les O2 et les O1 référencés.Problèmes de chargement d'un ensemble d'objets à l'aide de SQLAlchemy

Malheureusement, la requête ci-dessous échoue car la table O2 est aliasée dans la requête et la colonne référencée par la phrase order_by n'est plus connue.

Je voudrais savoir comment je peux résoudre ce problème tout en restant si possible dans la syntaxe déclarative.

base = declarative_base() 

class O1(base): 
    __tablename__ = 'O1' 
    value = Column(Integer) 
    o2_id = Column(Integer, ForeignKey('O1.id')) # The culprit 

class O2(base): 
    __tablename__ = 'O2' 
    id = Column(Integer, primary_key=True) 
    ones = relation('O1', order_by = ['O1.value']) 


Session.query(O2).options(eagerload('ones')).all() # Throws an error 

Répondre

3

Utilisez un lambda d'éléments de clause pour obtenir la liaison tardive de l'ordre par, comme ceci:

ones = relation('O1', order_by=lambda:[O1.value]) 

Ou comme une autre option, faire toute order_by une chaîne, comme ceci:

ones = relation('O1', order_by='O1.value, O1.something_else') 
+0

Merci. Les deux solutions fonctionnent. Je vais utiliser le second. Un ajout car il est ambigu: Lorsque vous utilisez des chaînes, vous devez utiliser les noms des mappeurs. Le 'O1' dans le second exemple fait référence à la classe, pas au nom de table. – ebo

Questions connexes