0

session.mergeSqlAlchemy で使用して、 を使用してテーブルにデータを挿入しますUniqueConstraint。これは、いくつかの列に共通です。たとえば、私の ORM クラスには次のものがあります。

UniqueConstraint("attr_1", "attr_2", "attr_3", name="attributes_uix")

挿入するデータがこの一意の制約に違反するかどうかを確認するためにfilterorfilter_byを使用する必要がありますか、それとも構造によってキャッチする適切な方法ですか?_andIntegrityErrortry - except

4

1 に答える 1

2

SQL錬金術の専門家ではありませんが、これと同様の質問にしばらく苦労してきました. この場合、正しい方法が1つあるかどうかはわかりません。私が説明できることは、db 例外を取得することとコードでそれを処理することの間のトレードオフが何であるかです。

個人的には、db 例外をトラップすることを好みます。これには、余分なクエリを実行しないという利点があります (余分な待ち時間など)。また、既存のフレームワークの一部を可能な限り再利用できるという利点もあります。

ただし、実際には 2 つの欠点があります。データベース設計レベルで解決できる 1 つ目は、NULL 値を含む一致が複数列の一意の制約に違反しないことです。言い換えれば、(id, value) に aa cnstraint がある場合、(1, null), (1, null)一意でないとは言えないため、整合性例外はスローされません。そのため、まず、この問題を回避できるかどうかを確認する価値があります。そうでない場合は、回避策を見つける必要がありますが、PostgreSQL には多くのツール (関数インデックスなど) が用意されています。

2 つ目は、IntegrityError のキャッチは一種の鈍器であり、インデックス名で使用可能なエラー メッセージを実際に解析できないことです。これは、システム間で異なる可能性があり、ロケールによってメッセージが翻訳される可能性があるためです。したがって、SQLSTATE に依存しており、これはあまり正確ではありません。つまり、機械で読み取り可能な優れた情報がありません。複数の候補がある場合、どの制約が無効になったか。

問題は、これらと重複するコードとクエリの間です。通常、エラーをキャッチすることはそれほど悪いことではないと思いますが、トレードオフがあるため、普遍的な推奨事項ではありません。

于 2015-11-02T04:47:56.013 に答える