TIL DAY 29 || Django Foreign key constraint failure on get_or_create()
3349 ワード
プロジェクトではfkによるミスをたくさん見かけましたが、今回のミスは特に勉強に値するのでご紹介したいと思います.
Foreign key constraint on get_or_create()
get or create()なぜエラーが発生したのか もしそうであれば、新しい列を作成せずにget; 新しく作成された場合、エラーは発生しません. そう思います.
だから半日うろうろしてやっと原因が分かった.これは先に商品をカートに入れて、すでにある商品ならば、入れた数量によって商品を追加するロジックです. したがって 問題はここから始まる.Aには3つの特定商品が含まれていますが、ユーザーがAという商品を4つ追加したらどうなりますか get or create()ロジックは、 この場合 新しいrowを作成しようとすると、
どうすれば間違いないの?
答えは簡単です.
quantityをデフォルトのキー値内のdicksherry形式に渡せばいいです.
次は、他の場合にfkコンストレイントが発生する理由をデバッグするプロセスです.
get or create()で新しいローを作成したときに発生したエラーのように.
fkコンストレイントエラーの原因を検索すると、デバッグする手順
別の例を挙げて説明したいと思います.
今度楽報を見ましょう.
これは、
Foreign key constraint on get_or_create()
最初はget or create()を見て、新しい世界だと思って快適に書いていたら、突然外キーエラーが発生しました.
エラー名は次のとおりです.FOREIGN KEY CONSTRAINT FAILS (5-8-2)
最初の考えは.
だから半日うろうろしてやっと原因が分かった.
product_id
、order_id
、product_option_id
はget or create()のパラメータに渡され、ない場合、新しいローを作成している場合は数のみが追加されます.quantity
、product_id
、order_id
、product_option_id
およびquantity
を最初に比較する.product_id
、order_id
、product_option_id
の3つの値は同じですがquantity
異なるため、新しいrowを作成しようとします.product_id
、order_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
をランダムに挿入したときに発生する問題です.Reference
この問題について(TIL DAY 29 || Django Foreign key constraint failure on get_or_create()), 我々は、より多くの情報をここで見つけました https://velog.io/@tk_kim/TIL-DAY-26-배민문방구-Project-21.03.22テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol