O valor da chave duplicada IntegrityError viola a restrição exclusiva - django / postgres
Estou acompanhando em relação a umpergunta que eu perguntei mais cedo em que eu tentei buscar uma conversão de uma consulta mysql goofy / pobremente escrita para postgresql. Eu acredito que consegui com isso. De qualquer forma, estou usando dados que foram movidos manualmente de um banco de dados mysql para um banco de dados postgres. Estou usando uma consulta assim:
"""
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)
)
Tenho motivos para acreditar que isso funciona bem. No entanto, isso levou a um novo problema. Ao tentar enviar, recebo um erro do django que afirma:
IntegrityError at (some url):
duplicate key value violates unique constraint "krypdos_value_pkey"
Eu olhei para várias das respostas postadas aqui e eu ainda não encontrei a solução para o meu problema (embora as questões relacionadas tenham feito algumas leituras interessantes). Eu vejo isso em meus logs, o que é interessante porque eu nunca chamo explicitamente de insert- django que deve lidar com isso:
STATEMENT: INSERT INTO "krypdos_value" ("code_round_id", "variable_id", "option_id", "confidence", "freetext")
VALUES (1105935, 11, 55, NULL, E'')
RETURNING "krypdos_value"."id"
No entanto, tentar executar isso resulta no erro de chave duplicado. O erro real é lançado no código abaixo.
# 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(
Eu verifiquei as seqüências e tal e eles parecem estar em ordem. A essa altura, não sei o que fazer - presumo que seja algo no final do Django, mas não tenho certeza. Qualquer feedback seria muito apreciado!