我正在跟着我先前提出的一个问题,在这个问题中,我试图寻求从愚蠢/编写不佳的mysql查询到postgresql的转换。我相信我成功了。无论如何,我正在使用从mysql数据库手动移动到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) )
我有理由相信这很好。但是,这导致了新问题。尝试提交时,我从django收到一条错误,指出:
IntegrityError at (some url): duplicate key value violates unique constraint "krypdos_value_pkey"
我已经看过这里发布的一些回复,但是我还没有找到解决我的问题的方法(尽管相关的问题引起了一些有趣的阅读)。我在日志中看到了这一点,这很有趣,因为我从未明确调用insert- django必须处理它:
STATEMENT: INSERT INTO "krypdos_value" ("code_round_id", "variable_id", "option_id", "confidence", "freetext") VALUES (1105935, 11, 55, NULL, E'') RETURNING "krypdos_value"."id"
但是,尝试运行该操作将导致重复键错误。实际的错误抛出在下面的代码中。
# 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(
我检查了序列等,它们似乎是有序的。在这一点上,我不确定该怎么做-我认为这是django的事情,但我不确定。任何反馈将不胜感激!
这发生在我身上-事实证明,你需要在Postgres中重新同步主键字段。关键是SQL语句:
SELECT setval('tablename_id_seq', (SELECT MAX(id) FROM tablename)+1)