4

実用的な解決策を見つけたクエリがあります。クエリを適切に実行しているかどうかわからないので、知りたいと思っていました。テーブルは次のように表示されます。

オーナー

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

q = session.query(Person).outerjoin(PetOwner).join(Animal).options(contains_eager("petowner_set"), contains_eager("petowner_set.animal"))

ペットの所有者にそれを接続する人に関係があります。

からへの結合 ANDからpersonへの結合が両方とも内部結合または両方の外部結合である場合は簡単です。ただし、 からへの結合は外部結合であり、 からへの結合は内部結合です。これを実現するために、オプションに 2 つの呼び出しを追加しました。petownerpetowneranimalpersonpetownerpetowneranimalcontains_eager

これはこれを達成する正しい方法ですか?

4

2 に答える 2

4

簡単な回答: 私が見る限り、動物を飼っていない人outerjoinを見たくない場合を除き、両方にPersons使用する必要があります。

まずJOINs を見てみましょう:

  • both INNER: この場合、クエリの結果は、少なくとも 1 匹の動物を持つ s のみを返します (any が null 可能でないことを前提としています)PersonPetOwner.animal
  • OUTER for PetOwner, INNER for Animal: 上記と同じ (繰り返しますが、anyPetOwner.animalは null 許容でないと仮定します)
  • both OUTER: クエリの結果は、所有しているかどうかに関係なく、すべて のを返します。PersonAnimal

では、どうcontains_eagerする?ドキュメントによると、

...指定された属性が現在クエリ内の列から積極的にロードされる必要があることをクエリに示します。

これが意味することは、SA が元のクエリから関係をロードするため、 にアクセスするときにPerson.petowner_set、追加のデータベース クエリは必要ないということです。これは作業方法にはまったく影響せJOINsず、リレーションシップの読み込みにのみ影響します。これは単なるデータ読み込みの最適化です。

于 2012-07-20T09:15:04.787 に答える