10

私は SQLAlchemy 0.5rc を使用しています。リレーションに自動フィルターを追加して、そのリレーションのレコードを取得しようとするたびに、"logically_deleted " (子テーブルのブール フィールド)

たとえば、オブジェクト「親」に 3 つのレコードを持つ「子」リレーションがあり、そのうちの 1 つが論理的に削除されている場合、「親」をクエリすると、SQLA で 2 つの子だけを持つ親オブジェクトを取得したいと思います。 .
どうすればいいですか?リレーションの primaryjoin パラメータに「and」条件を追加することによって? (例:「Children.parent_id == Parent.id and Children.logically_deleted == False」ですが、「and」はこのように書くのが正しいですか?)

編集:
私はこの方法でそれを行うことができました

children = relation("Children", primaryjoin=and_(id == Children.parent_id, Children.logically_deleted==False))

しかし、代わりに文字列を primaryjoin として使用する方法はありますか?

4

3 に答える 3

10

しかし、代わりに文字列を primaryjoin として使用する方法はありますか?

以下を使用できます。

children = relationship("Children", primaryjoin="and_(Parent.id==Children.parent_id, Children.logically_deleted==False)"

これは私のために働いた!

于 2012-12-14T23:51:38.140 に答える
4

and_() 関数は、& 演算子と共に SQLAlchemy で論理結合を行う正しい方法ですが、& 演算子には驚くべき優先順位規則があるため、注意してください。つまり、比較演算子よりも優先順位が高くなります。

text() コンストラクターを使用して文字列をプライマリ ジョインとして使用することもできますが、eagerloading と join に伴うテーブルのエイリアシングでコードが壊れてしまいます。

論理的な削除の場合、削除された値を無視する選択にクラス全体をマップする方がよい場合があります。

mapper(Something, select([sometable], sometable.c.deleted == False))
于 2008-11-10T18:23:30.197 に答える
0

私は現在、0.4.somethingに対してのみ開発していますが、これを提案する方法は次のとおりです。

db.query(Object).filter(Object.first==value).filter(Object.second==False).all()

それがあなたがやろうとしていることだと思いますよね?

(注: 実際のコードではなく、Web ブラウザーで記述されています!)

于 2008-11-06T08:48:54.257 に答える