Ich verfolge eine Frage, die ich zuvor gestellt habe und in der ich versucht habe, eine Konvertierung von einer doofen / schlecht geschriebenen MySQL-Abfrage zu Postgresql anzustreben. 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. Beim Versuch, etwas einzureichen, erhalte ich von django eine Fehlermeldung, 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 die Lösung für mein Problem nicht ganz gefunden (obwohl die damit verbundenen Fragen für eine interessante Lektüre gesorgt haben). Ich sehe dies in meinen Protokollen, was interessant ist, weil ich insert nicht explizit aufrufe. Django muss damit umgehen:
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, dies auszuführen, führt jedoch zu einem 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. An diesem Punkt bin ich mir nicht sicher, was ich tun soll - ich nehme an, es ist etwas am Ende von Django, aber ich bin mir nicht sicher. Jedes Feedback wäre sehr dankbar!
key[0] != '_' or key != 'csrfmiddlewaretoken'
gleichbedeutend mitnot (key[0] == '_' and key == 'csrfmiddlewaretoken')
. Es sollte leicht zu erkennen sein, dass die innere Bedingung niemals erfüllt ist, also äquivalent zunot (False)
oder mit anderen WortenTrue
. Aber warum sollte man sich dann mit dem beschäftigenif
?