Estoy siguiendo con respecto a un question that I asked earlier en el que busqué buscar una conversión de una consulta misteriosa/mal escrita de mysql a postgresql. Creo que tuve éxito con eso. De todos modos, estoy usando datos que se movieron manualmente desde una base de datos mysql a una base de datos postgres. Estoy usando una consulta que se ve así:IntegrityError valor clave duplicado viola la restricción única - 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)
)
Tengo razones para creer que esto funciona bien. Sin embargo, esto ha llevado a un nuevo problema. Cuando se trata de presentar, me sale un error de Django que dice:
IntegrityError at (some url):
duplicate key value violates unique constraint "krypdos_value_pkey"
He mirado en varias de las respuestas publicadas en aquí y no es haber encontrado la solución a mi problema (aunque las cuestiones relacionadas han hecho algunas lecturas interesantes). Veo esto en mis registros, lo cual es interesante porque nunca llamar explícitamente Insert- Django deben manejarlo:
STATEMENT: INSERT INTO "krypdos_value" ("code_round_id", "variable_id", "option_id", "confidence", "freetext")
VALUES (1105935, 11, 55, NULL, E'')
RETURNING "krypdos_value"."id"
Sin embargo, tratando de correr que los resultados en el error de clave duplicada. El error real se arroja en el código a continuación.
# 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(
He comprobado las secuencias y tal parece que están en orden. En este punto, no estoy seguro de qué hacer, supongo que es algo al final de Django, pero no estoy seguro. ¡Cualquier comentario sería muy apreciado!
Un aparte: según las leyes de De Morgan, su condición 'tecla [0]! = '_' O clave!= 'csrfmiddlewaretoken'' es equivalente a 'not (clave [0] ==' _ 'y clave ==' csrfmiddlewaretoken ')'. Debería ser fácil ver que la condición interna nunca está satisfecha, por lo que es equivalente a 'no (Falso)', o en otras palabras, 'Verdadero '. Pero entonces ¿por qué molestarse con el 'si'? –
'python manage.py sqlsequencereset | python manage.py dbshell' –
Medorator
Esta respuesta anterior brinda más detalles y aclara el tema: http://stackoverflow.com/questions/244243/how-toetrespost-postgres-primary-key-sequence-when-it-falls -out-of-sync – RedSands