最近更换了一台机器用来开发 Django 工程。把原先的数据库等环境都备份了过来,看上去一切正常。
但只要执行 migrate
指令,就会报错:
psycopg2.errors.UniqueViolation: 错误: 重复键违反唯一约束"django_content_type_pkey"
DETAIL: 键值"(id)=(8)" 已经存在
而且,每执行一次,报错的id字段就会增加1.
数据库用的是 PostgreSQL, 以我对数据库浅薄的认识来分析,应该是 Django 在 migrate
指令执行时,会自动向数据库插入一些数据:
- 向
django_migrations
中插入更新记录; - 向
django_content_type
中插入新模型的类型; - 向
auth_permission
中插入模型关联的用户权限等。
但在这个过程中,由于数据备份不完整,PostgreSQL的自增字段 id
被重置了,导致 Django 插入的数据 id
与现有数据发生冲突,所以就有了上面的错误。
知道问题所在,解决方法也就容易找到了。
执行下面两个数据库命令即可:
SELECT pg_get_serial_sequence('django_migrations', 'id');
SELECT setval('django_migrations_id_seq', (SELECT MAX(id) FROM django_migrations));
PostgreSQL 的自增字段对应了一个序列 Sequence.
第一个指令,就是找到这个字段对应的Sequence名称。
第二个指令,就是重置这个 Sequence,让其等于目前最大的id,这样下一次自增之后,就不会产生重复id。
上面只是以表 django_migrations
为例,其他表的冲突,解决方案相同。
网友评论