django-db-side-computation について
django-db-side-computation は、Python の計算をデータベースに移す Django 開発者向けのスキルです。ORM 式の選択、クエリ計画の確認、結果を保存するかの判断を案内し、正確性と性能の検証を促します。
主な機能
- 01DB に適した計算を特定
- 02Django ORM 式を選択
- 03SQL とクエリ計画を確認
- 04インデックスと結果保存を評価
- 05正確性と実行時間を比較
活用シーン
- 01関連オブジェクト数を DB 集計に置き換え
- 02行ごとに最新の関連値を取得
- 03ウィンドウ関数による順位付けを評価
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-db-side-computationインストール後、Claude Code で/django-db-side-computationを入力して読み込まれたか確認します。
同梱ファイルreferences/aggregation-patterns.md
詳細
Django のデータベース側計算
Django が、データベースのほうがより効率的または一貫性のある方法で計算できる値を求めるために、行を Python に取得している場合にこのスキルを使用します。
ワークフロー
-
Python で行っている計算を特定します。
- 件数、合計、最小値/最大値、真偽値、関連する最新の行、順位、非正規化された合計、行ごとの派生フィールド。
- 計算結果が正確で、最新であり、トランザクション上の一貫性が必要かどうかを確認します。
-
SQL 式のレベルを選択します。
- 単純な比較や更新には、
filter()、exclude()、F()を使用します。 - オブジェクトごとの件数や合計には、
annotate()と集計関数を使用します。 - 条件付きの件数や合計には、フィルター付き集計を使用します。
- 関連する行が存在するかどうかの確認には、
Exists()を使用します。 - 関連する値の最新値やスカラー値には、
OuterRef()と組み合わせたSubquery()を使用します。 - 順位や累積計算には、
Window()を使用します。 - データベースがサポートしている場合、同じ行の決定論的な計算列には
GeneratedFieldを使用します。
- 単純な比較や更新には、
-
クエリの形状を検証します。
- 生成された SQL または
QuerySet.explain()を確認します。 - 必要に応じて、グループ化の前に意図しない並び順を解除します。
- インデックスが結合、フィルター、並び順をサポートしていることを確認します。
- 生成された SQL または
-
結果を保存するかどうかを判断します。
- リクエスト時の値には注釈を使用します。
- 同じ行の決定論的な値には生成フィールドを使用します。
- 行をまたぐ集計クエリのコストが高く、古い値でも許容できる場合は、マテリアライズドビューまたは非正規化テーブルを使用します。
Django の式の例については、aggregation-patterns.md を参照してください。
安全上の注意
- データベースでの計算が常に高速とは限りません。複雑なクエリはデータベースに過度な負荷をかけたり、OLTP 処理をブロックしたりする可能性があります。
- 生成フィールドにはデータベース固有の制約があり、PostgreSQL がサポートしているのは永続化された生成列のみです。
- サブクエリと注釈は、慎重に組み合わせないと処理が重複することがあります。実行計画を確認してください。
検証
代表的なデータを使って、従来の Python による計算と結果が一致することを確認し、SQL の実行時間と応答時間の合計を測定してください。
コメント
Markdown 対応