2

背景:为 Django 应用程序运行 PostgreSQL 数据库(Django 1.1.1、Python2.4、psycopg2 和 Postgres 8.1)我已经多次从 SQL 转储中恢复了数据库。每次我这样做然后尝试添加一个新行,无论是外壳、管理员还是站点前端,我都会收到此错误:

IntegrityError: duplicate key violates unique constraint "app_model_pkey"

数据转储很好,正在重置序列。但是如果我再次尝试添加该行,它就成功了!因此,我可以尝试在每张桌子上插入一个新行,然后一切似乎都变得平淡无奇。

问题:鉴于(1)SQL 转储很好并且 Postgres 正确读取它(根据之前的问题),并且(2)Django 的 ORM 似乎没有系统地获取下一个值失败,在这个特定实例中发生了什么?

4

2 回答 2

2

Django 不以任何方式保存或直接读取序列值。我已经解释过了 f.ex。在这个问题中: 2088210/django-object-creation-and-postgres-sequences

当您尝试添加一行时,Postgresql 确实会增加序列,即使操作结果不成功(引发重复键错误),序列增量也不会回滚。因此,这就是您第二次尝试添加行时它起作用的原因。

我不知道为什么你的序列设置不正确,你能检查转储之前和恢复之后的序列值是什么,并对表的 max() pk 做同样的事情吗?也许这是恢复的8.1错误?我不知道。我敢肯定:这不是 Django 的错。

于 2010-07-05T02:27:10.620 回答
2

我猜你的序列已经过时了。

您可以像这样修复它:

select setval('app_model_id_seq', max(id)) from app_model;
于 2010-07-05T02:37:40.907 回答