Django ORM误读PostgreSQL序列?

时间:2010-07-02 18:21:28

标签: django postgresql django-orm

后台:为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似乎没有失败系统地获取下一个值,这个特定实例中发生了什么?

2 个答案:

答案 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;