Sto seguendo un question that I asked earlier in cui ho cercato di cercare una conversione da una query mysql goofy/mal scritta a postgresql. Credo di esserci riuscito. Ad ogni modo, sto usando i dati che sono stati spostati manualmente da un database mysql a un database postgres. Sto utilizzando una query che assomiglia così:IntegrityErrore valore chiave duplicato viola un vincolo univoco - django/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)
)
Ho ragione di credere che questo funziona bene. Tuttavia, questo ha portato a un nuovo problema. Quando si cerca di presentare, ottengo un errore da django che afferma:
IntegrityError at (some url):
duplicate key value violates unique constraint "krypdos_value_pkey"
Ho guardato alcune delle risposte pubblicate su questo sito e non ho abbastanza trovato la soluzione al mio problema (anche se le questioni connesse ho fatto per alcune letture interessanti). Vedo questo nei miei ceppi, il che è interessante perché non ho mai chiamare esplicitamente inserire: Django devono gestire la cosa:
STATEMENT: INSERT INTO "krypdos_value" ("code_round_id", "variable_id", "option_id", "confidence", "freetext")
VALUES (1105935, 11, 55, NULL, E'')
RETURNING "krypdos_value"."id"
Tuttavia, il tentativo di eseguire che genera l'errore chiave duplicata. L'errore effettivo viene generato nel codice qui sotto.
# 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(
Ho controllato le sequenze e tali e sembrano essere in ordine. A questo punto non sono sicuro di cosa fare- presumo che sia qualcosa alla fine del django ma non ne sono sicuro. Qualsiasi feedback sarebbe molto apprezzato!
Un conto a parte: secondo le leggi di De Morgan, la tua condizione 'chiave [0]! = '_' O chiave!= 'csrfmiddlewaretoken'' è equivalente a 'not (chiave [0] ==' _ 'e tasto ==' csrfmiddlewaretoken ')'. Dovrebbe essere facile vedere che la condizione interna non è mai soddisfatta, quindi è equivalente a 'not (False)', o in altre parole 'True'. Ma allora perché preoccuparsi del 'se'? –
'python manage.py sqlsequencereset | python manage.py dbshell' –
Medorator
Questa risposta precedente fornisce maggiori dettagli e luce sull'argomento: http://stackoverflow.com/questions/244243/how-to-reset-postgres-primary-key-sequence-when-it-falls -out-of-sync – RedSands