Sqlalchemy-orm-eager-loading
SQLAlchemy ORM-Eager Loading
負荷が大きいと、クエリの数が減ります。 SQLAlchemyは、クエリに追加の指示を与えるクエリオプションを介して呼び出される積極的な読み込み関数を提供します。 これらのオプションは、Query.options()メソッドを介してさまざまな属性をロードする方法を決定します。
サブクエリロード
Customer.invoicesを熱心にロードする必要があります。 orm.subqueryload()オプションは、ロードしたばかりの結果に関連付けられたコレクションを完全にロードする2番目のSELECTステートメントを提供します。 「subquery」という名前により、SELECTステートメントは、再利用されたクエリを介して直接構築され、関連テーブルに対するSELECTへのサブクエリとして埋め込まれます。
これは、次の2つのSQL式になります-
2つのテーブルからデータにアクセスするには、以下のプログラムを使用することができます-
上記のプログラムの出力は次のとおりです-
結合荷重
他の関数はorm.joinedload()と呼ばれます。 これにより、LEFT OUTER JOINが発行されます。 リードオブジェクトと関連オブジェクトまたはコレクションが1ステップでロードされます。
これは、上記と同じ出力を与える次の式を出力します-
OUTER JOINは2行になりましたが、Customerのインスタンスを1つ返します。 これは、Queryが、返されたエンティティにオブジェクトIDに基づいて「一意」戦略を適用するためです。 クエリ結果に影響を与えることなく、結合されたイーガーロードを適用できます。
関連クエリのロードにはsubqueryload()の方が適していますが、joinedload()は多対1の関係に適しています。