背景:为Django应用程序运行PostgreSQL数据库(Django 1.1.1,Python2.4,psycopg2和Postgres 8.1)我已经多次从SQL转储中恢复数据库。每次我这样做,然后尝试添加一个新行,无论是外壳,管理员或网站前端,我得到这个错误:Django ORM误读PostgreSQL序列?
IntegrityError: duplicate key violates unique constraint "app_model_pkey"
的数据转储是罚款,并重置序列。 但是,如果我尝试再次添加该行,则会成功!所以我可以尝试在每个表格中堵塞一个新的行,然后一切似乎都是一致的。
问题:鉴于(1)SQL转储是好的和Postgres正确阅读它(每earlier question),和(2)Django的ORM似乎并没有被失败的全身得到下一个值,这是怎么回事在这个特定的例子?
我想我明白为什么,但是这似乎是答案。我只有一个认证组,并且转储将该ID序列的当前值设置为1:'SELECT pg_catalog.setval('auth_group_id_seq',1,false);'。如果我尝试从该序列中选择nextval,它也是1. nextval的后续查询会将序列颠倒为2. – bennylope 2010-07-08 01:09:34
这是不正确的; Django实际上是从PostgreSQL序列中获取值。如果启用数据库中所有语句的日志记录,则会看到Django发出了不少“SELECT CURRVAL('”app_table_id_seq“');'命令。事实上,如果你看看'django.db.models.sql.compiler.SQLInsertCompiler.execute_sql()'和'django.db.backends.postgresql.operations.DatabaseOperations.last_insert_id()'的代码,你会发现它在每个单独的INSERT命令之后取出序列值,除非'autocommit = True'。 – 2010-07-18 06:44:29