2009-05-19 6 views
2

Ich verwende TurboGears2 und SQLAlchemy, um eine Webanwendung zu entwickeln. Ich habe zwei gemappte Tabellen O1 und O2. O2 hat eine sortierte Liste von O1s in 'Einsen'. Irgendwann möchte ich alle O2 und die referenzierten O1s abfragen.Probleme eiglading eine Reihe von Objekten mit SQLAlchemy

Leider schlägt die folgende Abfrage fehl, weil die Tabelle O2 in der Abfrage einen Alias ​​enthält und die Spalte, auf die der Befehl order_by verweist, nicht mehr bekannt ist.

Ich würde gerne wissen, wie ich dieses Problem beheben kann, während, wenn möglich, in der deklarativen Syntax bleiben.

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 

Antwort

3

eine Lambda-Klausel Elemente Verwenden der Bestellung die späte Bindung zu erreichen, indem sie, wie folgt aus:

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

Oder als weitere Option die ganze order_by ein String machen, wie folgt aus:

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

Danke. Beide Lösungen funktionieren. Ich werde den zweiten benutzen. Ein Zusatz, weil es mehrdeutig ist: Wenn Sie Strings verwenden, müssen Sie die Mapper-Namen verwenden. Das 'O1' im zweiten Beispiel bezieht sich eigentlich auf die Klasse, nicht den Tabellennamen. – ebo

Verwandte Themen