状況
利用者一覧の CSV 出力を AI アシスタントに書かせた。利用者は約 5 万人。company は必須の外部キー(NULL にならない)。検証環境の 10 人では一瞬で終わった。
本番に出す前に直すべき点は?
users = User.objects.all()for u in users: writer.writerow([u.name, u.company.name])正答
- all() は全件をメモリに載せるので、5 万件だと必ずメモリ不足で落ちる
- users が 0 件のとき、for 文がエラーになるので件数を先に調べるべき
- u.company が NULL のとき落ちるので、None の確認を足すべき
- ループの中で会社を 1 件ずつ取りに行き、利用者の数だけクエリが走る
解説
u.company.name を参照するたびに会社を 1 件ずつ DB から取るので、利用者 1 回 + 会社 5 万回のクエリが走る(N+1 問題)。検証環境の 10 人では気づかず、本番で極端に遅くなる。select_related('company') のように関連をまとめて取る指定を足す。AI のコードは小さなデータで動いても、件数が増えたときの振る舞いまでは保証しない。5 万件程度なら all() で必ず落ちるとは言えず、0 件の for はエラーにならない。company は必須の外部キーと決まっているので None の確認は不要。
この問題を含む AI の出力チェック のテストを制限時間つきで解く
AI の出力チェッククイズへ