【SQLAlchemy】SQLAlchemyのrelationshipのオプション「lazy」が気になったので調べてみた

  • 2023年5月4日
  • 2023年5月4日
  • python

こんにちは。

野中やすおです。

今開発中のWebアプリでSQLAlchemyのrelationshipを使う機会があったのですが、relationshipのオプションlazy loadがあまり理解できていなかったので、調べてみました。

SQLAlchemyのrelationshipとは

そもそもSQLAlchemyのrelationshipとは、DB内の各テーブルの関係性を付与するメソッドになります。

SQLAlchemyのrelationshipには、以下の3つの読み込み(ロード)する方法があります。

  • lazy loading
  • eager loading
  • no loading

lazy loading

データベースアクセス時に全てのrelationshipを取得するのではなく、必要なときに必要なレコードを取得することを指します。SQLAlchemyでは、このlazy loadingがデフォルトとなっています。

eager loading

クエリから返されるオブジェクトのうち、関連するコレクションやスカラー参照がすでに前もってロードされているものを指すとのことです。正直なんのこっちゃと思ったのですが、こちらのQiitaの記事を読んで腑に落ちました。

Qiita

はじめに先日、N+1 問題による web API のスループット低下に直面しました。(私は 1+N と呼びたいが、以降 …

検証ありがとうございます!

no loading

特定のrelationshipでの読み込みを無効にすることを指します。

lazy loading

公式サイトによると、デフォルトは「lazy=’select’」または「lazy=True」のようです。私は以下のように設定しました。

他にも色々とlazyにはオプションがありますが、まだまだ勉強中です。。。