Django ORM误读PostgreSQL序列?

Django ORM误读PostgreSQL序列?,django,postgresql,django-orm,Django,Postgresql,Django Orm,Background:为Django应用程序(Django 1.1.1、Python2.4、psycopg2和Postgres 8.1)运行PostgreSQL数据库,我已多次从SQL转储还原数据库。每次我这样做,然后尝试添加新行(shell、admin或站点前端),都会出现以下错误: IntegrityError:重复密钥违反唯一约束“app\u model\u pkey” 数据转储正常,正在重置序列。但是如果我再次尝试添加行,它将成功!所以我可以试着在每一张桌子上塞进一行,然后一切看起来都很

Background:为Django应用程序(Django 1.1.1、Python2.4、psycopg2和Postgres 8.1)运行PostgreSQL数据库,我已多次从SQL转储还原数据库。每次我这样做,然后尝试添加新行(shell、admin或站点前端),都会出现以下错误:

IntegrityError:重复密钥违反唯一约束“app\u model\u pkey”

数据转储正常,正在重置序列。但是如果我再次尝试添加行,它将成功!所以我可以试着在每一张桌子上塞进一行,然后一切看起来都很顺利


问题:假设(1)SQL转储良好,Postgres正确读取(per),以及(2)Django的ORM似乎没有系统性地获取下一个值,那么在这个特定实例中会发生什么

Django不以任何方式保存或直接读取序列值。我已经解释过了。在

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


我不知道为什么您的序列设置不正确,您是否可以检查转储之前和还原之后的序列值,并对表的max()pk执行相同的操作?可能是8.1版本的错误导致了恢复?我不知道。我确信的是:这不是Django的错。

我猜你的序列已经过时了

您可以这样修复:

select setval('app_model_id_seq', max(id)) from app_model;

我希望我能理解为什么,但这似乎是答案。我只有一个身份验证组,转储将该ID序列的当前值设置为1:
SELECT pg_catalog.setval('auth_group_ID_seq',1,false)。如果我试着从那个序列中选择下一个,它也是1。对nextval的后续查询将序列颠簸到2。这是不正确的;Django实际上从PostgreSQL序列中获取值。如果启用数据库中所有语句的日志记录,您将看到Django发布了很多
SELECT CURRVAL(“'app_table_id_seq')命令。事实上,如果您查看
django.db.models.sql.compiler.SQLInsertCompiler.execute\u sql()
django.db.backends.postgresql.operations.DatabaseOperations.last\u insert\u id()
,您将看到它在每次插入命令后都会获取序列值,除非
autocommit=True