后台:为Django应用程序运行PostgreSQL数据库(Django 1.1.1,Python2.4,psycopg2和Postgres 8.1)我已经多次从SQL转储中恢复数据库。每次我这样做,然后尝试添加一个新行,无论是shell,管理员还是站点前端,我都会收到此错误:
IntegrityError: duplicate key violates unique constraint "app_model_pkey"
数据转储很好,正在重置序列。 但是如果我再次尝试添加行,那就很成功了!所以我可以尝试在每个表中插入一个新行,然后一切似乎都是copacetic。
问题:鉴于(1)SQL转储正常并且Postgres正确读取它(每earlier question),以及(2)Django的ORM似乎没有失败系统地获取下一个值,这个特定实例中发生了什么?
答案 0 :(得分:2)
Django不以任何方式持有或直接读取序列值。我已经解释过f.ex.在this question: 2088210/django-object-creation-and-postgres-sequences。
当您尝试添加行时,Postgresql会递增序列,即使操作的结果不成功(引发重复键错误),序列递增也不会回滚。所以,这就是为什么第二次尝试添加行时它会起作用的原因。
我不知道为什么你的序列设置不正确,你能检查转储前和恢复后的序列值是什么,并对表的max()pk做同样的事情吗?也许这是一个8.1恢复错误?我不知道。我确定的是:这不是Django的错。
答案 1 :(得分:2)
我猜你的序列已经过时了。
你可以这样解决:
select setval('app_model_id_seq', max(id)) from app_model;