django-queryset-batch-processing について
大量のデータベース行を処理する Django 開発者向けのスキルです。不要なモデル読み込みや QuerySet キャッシュを抑えつつ、読み書きの方法、バッチサイズ、安全性の確認を案内します。
主な機能
- 01スカラー読み込みとイテレーターの選択
- 02集合ベースの一括書き込み
- 03バッチとトランザクションサイズの管理
- 04省略されるフックやシグナルの確認
- 05処理速度、メモリ、正確性の測定
活用シーン
- 01大量行を扱うエクスポートやレポート
- 02多数レコードの効率的な更新
- 03バッチを制限した本番ジョブの実行
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-queryset-batch-processingインストール後、Claude Code で/django-queryset-batch-processingを入力して読み込まれたか確認します。
同梱ファイルreferences/batch-patterns.md
詳細
Django QuerySet のバッチ処理
Django のコードで多数の行を処理する場合は、このスキルを使用します。不要なモデルインスタンスの読み込みや、QuerySet の結果キャッシュの肥大化を避け、動作上問題がなければ書き込みを集合ベースのデータベース操作に移行することを目指します。
ワークフロー
-
行ごとの処理を特定します。
- 読み取り専用のエクスポートやレポートですか?
- モデルのメソッド、バリデーション、シグナルが必要ですか?
- データベースで値を直接計算または更新できますか?
-
読み取りパターンを選びます。
- スカラー値のエクスポートやレポートには
values()またはvalues_list()を使用します。 - モデルインスタンスが必要でも QuerySet のキャッシュが不要な場合は、
iterator(chunk_size=...)を使用します。 - 並び順は意図的に指定します。不要な並び替えは処理コストになります。
- スカラー値のエクスポートやレポートには
-
書き込みパターンを選びます。
- 一律の更新には、
F()または式とともにQuerySet.update()を使用します。 - オブジェクトごとに値が異なる場合は、
bulk_update()を使用します。 - 挿入には
bulk_create()を使用します。競合オプションは、プロジェクトでその動作がサポートされている場合に限り指定します。 - フック、バリデーション、副作用、シグナルが必要な場合にのみ、インスタンスごとの
save()にフォールバックします。
- 一律の更新には、
-
バッチサイズを制御します。
- トランザクションの規模を抑えます。
- 巨大な
INリストや過度に大きなCASE更新は避けます。 - 本番ジョブでは、ロック、レプリケーションラグ、メモリを監視します。
例と注意事項については、batch-patterns.md を参照してください。
安全に関する注意事項
- 一括更新・削除操作では、各モデルインスタンスの
save()メソッドやdelete()メソッドは呼び出されません。 - 一括操作では、アプリケーションレベルの副作用やシグナルが省略されることがあります。
- 長時間のトランザクションはロックを保持し、バキュームやレプリケーションを遅延させる可能性があります。
検証
代表的なバッチで、1 秒あたりの処理行数、クエリ数、メモリ使用量、トランザクション時間、正確性を測定します。
コメント
Markdown 対応