SQL錬金術の専門家ではありませんが、これと同様の質問にしばらく苦労してきました. この場合、正しい方法が1つあるかどうかはわかりません。私が説明できることは、db 例外を取得することとコードでそれを処理することの間のトレードオフが何であるかです。
個人的には、db 例外をトラップすることを好みます。これには、余分なクエリを実行しないという利点があります (余分な待ち時間など)。また、既存のフレームワークの一部を可能な限り再利用できるという利点もあります。
ただし、実際には 2 つの欠点があります。データベース設計レベルで解決できる 1 つ目は、NULL 値を含む一致が複数列の一意の制約に違反しないことです。言い換えれば、(id, value) に aa cnstraint がある場合、(1, null), (1, null)
一意でないとは言えないため、整合性例外はスローされません。そのため、まず、この問題を回避できるかどうかを確認する価値があります。そうでない場合は、回避策を見つける必要がありますが、PostgreSQL には多くのツール (関数インデックスなど) が用意されています。
2 つ目は、IntegrityError のキャッチは一種の鈍器であり、インデックス名で使用可能なエラー メッセージを実際に解析できないことです。これは、システム間で異なる可能性があり、ロケールによってメッセージが翻訳される可能性があるためです。したがって、SQLSTATE に依存しており、これはあまり正確ではありません。つまり、機械で読み取り可能な優れた情報がありません。複数の候補がある場合、どの制約が無効になったか。
問題は、これらと重複するコードとクエリの間です。通常、エラーをキャッチすることはそれほど悪いことではないと思いますが、トレードオフがあるため、普遍的な推奨事項ではありません。