🏄

サロゲートキーと型の問題に悩む

2024/08/04に公開

python特有の問題ではなく、トラブルシューティングの記事になります。何かの気付きになればと思います。

よくある実装

# request_booksリストの中でsearched_book_Idsに属するものを選択
target = [book for book in request_books if book.id in searched_book_ids]
# targetに対して処理する

上記のようなよくある処理を書いていましたがドハマリしました。
処理自体はエラーにならないのですが、並行して書いていたテストケースで対象の数が合わなくなり、その原因の分析に推定2時間近く溶かしたかもしれません。

原因

book.idを条件にするのは誤りで、正しくはbook.book_idで評価する必要があったということです。idはサロゲートキーで、book_idが本そのもののIDだということです。

サロゲートキー

私が現PJに参画してからまだ日が浅かった事があります。前PJでのDB設計ではサロゲートキーを原則使わない方針でしたが、現PJはフレームワーク的にもサロゲートキーは基本つくものだったという事で、そこの意識にズレがあり慣れもなかったという訳です。
また、原因分析で気づきにくくなる要因もここにありまして、並行で書いていたテストケースのいくつかは通っていたことです。これはサロゲートキーのidとbook_idはauto_incrementなので、両方ともテスト用にDBに作成されていく際は1からカウントアップされ、id=1,book_id=1のケースなど正常に処理されてしまうという事です。正常に通るケースを真と捉えて別の可能性を探って時間を溶かしてしまいました。

型の問題

pythonで書いていましたが型が無かったために、book_idが補完の候補にサジェストされなかった事も要因の一つとしてあります。最新のpythonも型自体はつけられるため、そこもちゃんと意識して付けていくことが重要だと思いました。(この時pythonを本格的に書いて20日未満)

Discussion