【要約】1件の不正データでバッチが全滅する問題、フォールバックを足すのではなく入り口を絞った話 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が、外部ソースから取得したニュース記事をDBに保存するバッチ処理において、一部の不正データが原因で全件の保存が失敗する問題に直面した。
- ・MySQLのstrictモードにより、1件でもカラム長制約に触れると一括insertがロールバックされる。
- ・外部サイトの仕様変更により、想定外に長いタイトルやURLが混入するリスクがある。
- ・特定のソースに対してのみ局所的な対処を行っており、実装の不整合が生じていた。
// Approach
開発者は、失敗時の迂回経路を作るのではなく、保存前にデータを整える「サニタイズ」による解決を選択した。
- ・保存経路を1つに保つことで、テストの複雑化と未検証のバグ混入を回避した。
- ・カラムの役割に基づき、titleは切り詰め、urlは行ごとスキップする等の戦略を分けた。
- ・SQLAlchemyのモデル定義から制約値を動的に取得し、定義の重複と乖離を防いだ。
// Result
開発者は、システムの堅牢性と保守性を高める設計を実現した。
- ・保存ロジックを単純化し、サニタイズ関数の入出力という明確な単位でテストが可能になった。
- ・モデル定義を「単一の真実」とすることで、将来的な制約値の不整合を未然に防いだ。
- ・テスト環境(SQLite)の制約の緩さを考慮し、実装をわざと壊してテストの検知能力を検証した。
Senior Engineer Insight
> 本件の優れた点は、例外処理による「経路の増加」を拒絶した点にある。大規模システムでは、普段通らないフォールバック経路が最大の脆弱性となる。案2のように正常系の中にバリデーションを組み込む設計は、運用コストとテストコストを最小化する。また、テスト環境の特性を理解し、テスト自体の有効性を検証するプロセスは、極めて実践的で信頼に値する。