29

2 つのテーブルを結合するときに、ON 句に 2 つの条件を追加する方法。階層に 3 つのテーブルがあり、それぞれに削除フラグが付いています。これらすべてのテーブルを単一のクエリに結合し、削除済みフラグにも基づいてフィルター処理する必要があります。現在、条件はクエリの where 句に追加され、削除されたレコードはフィルタリングされません。ON 句に追加する必要があります。提案してください。

私の現在のクエリは次のとおりです。

result = session.query(Host).filter(and_(Host.id.in_(ids), Host.deleted == False)).\
    join(Switch).filter(Switch.deleted == False).\
    join(Port).filter(Port.deleted == False).\
    options(joinedload('switches')).\
    options(joinedload('ports')).\
    all()

ありがとうございました

4

3 に答える 3

52

Try contains_eager instead of joinedload. What is probably happening is that you have 4 joins the two you defined with join and then then the two from the options(joinedload(...))

Modifying your code, should give this:

from sqlalchemy import and_

result = (session.query(Host).filter(and_(Host.id.in_(ids), Host.deleted == False)).
    join(Switch, and_(Switch.host_id==Host.id, Switch.deleted == False)).
    join(Port, and_(Port.switch_id==Switch.id, Port.deleted == False)).
    options(contains_eager('switches')).
    options(contains_eager('ports')).
    all()
)
于 2012-06-27T23:55:08.993 に答える
7

パラメーターを使用して、呼び出しONで句を明示的に指定できます。次に、クエリは次のようになります (テストされていません)。Query.joinonclause

from sqlalchemy import and_

result = (session.query(Host).filter(and_(Host.id.in_(ids), Host.deleted == False)).
    join(Switch, and_(Switch.host_id==Host.id, Switch.deleted == False)).
    join(Port, and_(Port.switch_id==Switch.id, Port.deleted == False)).
    options(joinedload('switches')).
    options(joinedload('ports')).
    all()
)
于 2012-06-22T10:35:21.287 に答える