こんにちは。
野中やすおです。
今開発中の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」のようです。私は以下のように設定しました。
1 |
reviews = db.relationship("Review", backref="game", lazy=True, cascade="delete") |
他にも色々とlazyにはオプションがありますが、まだまだ勉強中です。。。