2009-05-19 10 views
2

私はTurbogears2とSQLAlchemyを使ってWebアプリケーションを開発しています。私は2つのマップされたテーブルO1とO2を持っています。 O2は、 'ones'にO1のソートされたリストを持っています。 ある時点で、すべてのO2と参照されているO1を照会する必要があります。SQLAlchemyを使用してオブジェクトのセットをeagerloadingする問題

残念ながら、テーブルO2がクエリでエイリアスになっていて、order_byフレーズで参照されているカラムが既知でないため、以下のクエリは失敗します。

可能であれば、この問題を解決できる方法を知りたいのですが、宣言構文にとどまっています。

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 

答えて

3

このように、順に遅延バインディングを達成するための句要素のラムダを使用します。

:このように、

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

それとも別のオプションとして、全体ORDER_BYに文字列を作ります

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

ありがとうございました。どちらのソリューションも機能します。私は2番目のものを使用します。 1つの追加はあいまいであるため:文字列を使用するときは、マッパー名を使用する必要があります。 2番目の例の 'O1'は実際にはtablenameではなくクラスを参照しています。 – ebo

関連する問題