Der doppelte Schlüsselwert IntegrityError verstößt gegen die eindeutige Einschränkung "django / postgres"
Ich verfolge in Bezug auf aFrage, die ich früher gestellt habe in dem ich versucht habe, eine Konvertierung von einer doof / schlecht geschriebenen MySQL-Abfrage nach PostGresQL zu suchen. Ich glaube, das ist mir gelungen. Wie auch immer, ich verwende Daten, die manuell von einer MySQL-Datenbank in eine Postgres-Datenbank verschoben wurden. Ich verwende eine Abfrage, die so aussieht:
"""
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)
)
Ich habe Grund zu der Annahme, dass dies gut funktioniert. Dies hat jedoch zu einem neuen Problem geführt. Wenn ich versuche zu übermitteln, erhalte ich eine Fehlermeldung von Django, die besagt:
IntegrityError at (some url):
duplicate key value violates unique constraint "krypdos_value_pkey"
Ich habe mir einige der hier veröffentlichten Antworten angesehen und noch keine Lösung für mein Problem gefunden (obwohl die damit zusammenhängenden Fragen für einige interessante Lektüre gesorgt haben). Ich sehe das in meinen Protokollen, was interessant ist, weil ich insert-django nie explizit aufrufen muss:
STATEMENT: INSERT INTO "krypdos_value" ("code_round_id", "variable_id", "option_id", "confidence", "freetext")
VALUES (1105935, 11, 55, NULL, E'')
RETURNING "krypdos_value"."id"
Der Versuch, das auszuführen, führt jedoch zu dem doppelten Schlüsselfehler. Der eigentliche Fehler wird im folgenden Code ausgegeben.
# 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(
Ich habe die Sequenzen und dergleichen überprüft und sie scheinen in Ordnung zu sein. Zu diesem Zeitpunkt bin ich mir nicht sicher, was ich tun soll - ich gehe davon aus, dass es etwas am Ende von Django ist, aber ich bin nicht sicher. Jedes Feedback wäre sehr dankbar!