2016-11-15 8 views
7

に参加する:すなわちは、私は次のクラス持っ

class A: 
    a_id = Column(Integer, primary_key=True) 
    a_remote = Column(UnicodeText) 

class B: 
    b_id = Column(Integer, primary_key=True) 
    foreign_to_a = Column(UnicodeText) 
    maximum_a = relationship(A, primaryjoin=lambda: 
     and_(remote(a_remote) == foreign(foreign_to_a), 
      A.a_id = select([func.max(A.a_id)]).where(A.a_remote == B.foreign_to_a)) 
    ) 

を、私はすべてのAさんは、与えられたBによって指さの最大a_idとの関係maximum_aを作成しようとしています私は具体的にこれを関係にして、joinedloadでプリフェッチできるようにして、O(N)クエリーがある場合を避けるようにします。

私は(例えばsession.query(B).options(joinedload('maximum_a')).all()経由)maximum_a関係をプリロードしようとすると、私は次のエラーを取得する:

sqlalchemy.exc.InvalidRequestError: Select statement 'SELECT max(a_1.a_id) AS max_1 
FROM a AS a_1, b 
WHERE a_1.a_remote = b.foreign_to_a' returned no FROM clauses due to auto-correlation; specify correlate(<tables>) to control correlation manually. 

私は相関のSQLAのドキュメントを読むことを試みたが、それらはすべてで書かれていますORMの呼び出しではなく、selectという生の言葉を使用しています。その説明はあまり明確ではないので、correlateの呼び出しをどこに追加するのかわかりません。

提案がありますか?ありがとう!ずっとしようとした後

+0

たぶん、[継承や多型のロード]を見てみましょう(http://docs.sqlalchemy.org/en/latest/orm/inheritance.html#結合テーブル継承) – sytech

+0

これはどのように関連性がありますか?この問題は、継承や多型に関係していないようです。 –

+1

申し訳ありません、ベン。私はこの質問を誤解しているかもしれません。私は、目的の結果を得る手段として継承を提案していましたが、質問を読み返した後、私はあなたのケースに合っているとは思わないのです。 – sytech

答えて

6

は、ここで働いていたものです:

class A: 
    a_id = Column(Integer, primary_key=True) 
    a_remote = Column(UnicodeText) 

latest_a = select([ 
    func.max(A.a_id).label('a_id'), A.a_remote 
]).group_by(A.a_remote).alias('latest_a') 

class B: 
    b_id = Column(Integer, primary_key=True) 
    foreign_to_a = Column(UnicodeText) 
    maximum_a = relationship(A, 
     secondary=latest_a, 
     primaryjoin=latest_a.c.a_remote == foreign_to_a, 
     secondaryjoin=latest_a.c.a_id == A.a_id, 
     uselist=False, viewonly=True) 
関連する問題