TIL DAY 29 || Django Foreign key constraint failure on get_or_create()


プロジェクトではfkによるミスをたくさん見かけましたが、今回のミスは特に勉強に値するのでご紹介したいと思います.

Foreign key constraint on get_or_create()



最初はget or create()を見て、新しい世界だと思って快適に書いていたら、突然外キーエラーが発生しました.
エラー名は次のとおりです.FOREIGN KEY CONSTRAINT FAILS (5-8-2)最初の考えは.
  • get or create()なぜエラーが発生したのか
  • もしそうであれば、新しい列を作成せずにget;
  • 新しく作成された場合、エラーは発生しません.
  • そう思います.
    だから半日うろうろしてやっと原因が分かった.
  • これは先に商品をカートに入れて、すでにある商品ならば、入れた数量によって商品を追加するロジックです.
  • したがってproduct_idorder_idproduct_option_idはget or create()のパラメータに渡され、ない場合、新しいローを作成している場合は数のみが追加されます.
  • 問題はここから始まる.
  • Aには3つの特定商品が含まれていますが、ユーザーがAという商品を4つ追加したらどうなりますか
  • get or create()ロジックは、quantityproduct_idorder_idproduct_option_idおよびquantityを最初に比較する.
  • この場合product_idorder_idproduct_option_idの3つの値は同じですがquantity異なるため、新しいrowを作成しようとします.
  • 新しいrowを作成しようとすると、product_idorder_idおよびproduct_option_idの値が一意に囲まれているため、エラーが放出されます.
  • quantity以外の3つのカラムの値をモデルとします.pyがuniqueを組み合わせたためにエラーが発生しました.
    どうすれば間違いないの?
    答えは簡単です.
    quantityをデフォルトのキー値内のdicksherry形式に渡せばいいです.
    cart, is_created = Cart.objects.get_or_create(
    					      product_id        = product_id,
                                                  order             = order,
                                                  product_option_id = option['product_option_id']
                                                  defaults          = {'quantity': option['product_option_quantity']}
                                                  
    これを行うとdefaults値を除いてチェックされ、ない場合はdefaults値を入力した値を持つ値を作成している場合は、対応するrowがインポートされます.

    How to debug FK constraint error on some other cases


    次は、他の場合にfkコンストレイントが発生する理由をデバッグするプロセスです.
    get or create()で新しいローを作成したときに発生したエラーのように.
    fkコンストレイントエラーの原因を検索すると、デバッグする手順
    別の例を挙げて説明したいと思います.
    今度楽報を見ましょう.
    FOREIGN KEY ('product_option_id') REFERENCES 'product_options' ('id')この部分ですが、ここからデバッグすればいいです.
  • product_option_id実際のproduct_optionsテーブルのidを参照しようとしたときに発生したエラー
  • product_option_idは23番で、上の表にはID 23番の行はありません.
  • これは、
  • product_option_idをランダムに挿入したときに発生する問題です.