1. ホーム
  2. django

[解決済み] IntegrityError 重複するキー値は一意制約に違反する - django/postgres

2023-07-24 13:38:44

質問

に関してフォローアップしています。 の質問に関してフォローアップしています。 で、私はおかしな/貧弱に書かれたmysqlクエリからpostgresqlへの変換を求めました。私はそれで成功したと信じています。とにかく、私はmysqlデータベースからpostgresデータベースに手動で移動させたデータを使用しています。私は次のようなクエリを使用しています。

  UPDATE krypdos_coderound cru

  set is_correct = case 
      when t.kv_values1 = t.kv_values2 then True 
      else False 
      end

  from 
  
  (select cr.id, 
    array_agg(
    case when kv1.code_round_id = cr.id 
    then kv1.option_id 
    else null end 
    ) as kv_values1,

    array_agg(
    case when kv2.code_round_id = cr_m.id 
    then kv2.option_id 
    else null end 
    ) as kv_values2

    from krypdos_coderound cr
     join krypdos_value kv1 on kv1.code_round_id = cr.id
     join krypdos_coderound cr_m 
       on cr_m.object_id=cr.object_id 
       and cr_m.content_type_id =cr.content_type_id 
     join krypdos_value kv2 on kv2.code_round_id = cr_m.id

   WHERE
     cr.is_master= False
     AND cr_m.is_master= True 
     AND cr.object_id=%s 
     AND cr.content_type_id=%s 

   GROUP BY cr.id  
  ) t

where t.id = cru.id
    """ % ( self.object_id, self.content_type.id)
  )

これがうまく機能すると信じるに足る理由があります。しかし、これが新たな問題を引き起こしています。投稿しようとすると、django から次のようなエラーが表示されます。

IntegrityError at (some url): 
duplicate key value violates unique constraint "krypdos_value_pkey"

ここに投稿されたいくつかの回答を見ましたが、私の問題に対する解決策はまだ見つかっていません (関連する質問はいくつか興味深い読み物になっていますが)。私はログでこれを見ましたが、私は明示的に挿入を呼び出したことがないので、これは興味深いことです-djangoはそれを処理しなければなりません。

   STATEMENT:  INSERT INTO "krypdos_value" ("code_round_id", "variable_id", "option_id", "confidence", "freetext")
   VALUES (1105935, 11, 55, NULL, E'') 
   RETURNING "krypdos_value"."id"

しかし、これを実行しようとすると、キーが重複しているというエラーが発生します。実際のエラーは、以下のコードで投げられています。

 # Delete current coding         CodeRound.objects.filter(object_id=o.id,content_type=object_type,is_master=True).delete()
  code_round = CodeRound(object_id=o.id,content_type=object_type,coded_by=request.user,comments=request.POST.get('_comments',None),is_master=True)
  code_round.save()
  for key in request.POST.keys():
    if key[0] != '_' or key != 'csrfmiddlewaretoken':
      options = request.POST.getlist(key)
      for option in options:
        Value(code_round=code_round,variable_id=key,option_id=option,confidence=request.POST.get('_confidence_'+key, None)).save()  #This is where it dies
  # Resave to set is_correct
  code_round.save()
  o.status = '3' 
  o.save(

配列などを確認したところ、順当なようです。この時点で、私は何をすべきかわからない - 私はdjango側の何かだと仮定しますが、私はよくわかりません。何かフィードバックがあれば、とてもありがたいです。

どのように解決するのですか?

Postgres の主キーフィールドを再同期する必要があることがわかりました。キーはSQLステートメントです。

SELECT setval('tablename_id_seq', (SELECT MAX(id) FROM tablename)+1);