美文网首页
Django migrate 报重复键错误

Django migrate 报重复键错误

作者: alue | 来源:发表于2023-11-11 17:41 被阅读0次

    最近更换了一台机器用来开发 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 为例,其他表的冲突,解决方案相同。

    相关文章

      网友评论

          本文标题:Django migrate 报重复键错误

          本文链接:https://www.haomeiwen.com/subject/aptlwdtx.html