【问题标题】:IntegrityError: (1062, "Duplicate entry '3-add_author' for key 2")IntegrityError:(1062,“密钥 2 的重复条目 '3-add_author'”)
【发布时间】:2011-11-15 03:05:22
【问题描述】:

数据库是 MySQL。

我使用 django.contrib.auth。

这里是所有信息:

manage.py dumpdata auth > my_auth.json --natural --exclude contenttypes

然后我删除了整个数据库(drop database my_database),并创建了一个新数据库(create database new_database)(使用./manage.py syncdb创建所有表)。

然后

manage.py 加载数据 my_auth.json

我遇到了一个错误:

IntegrityError: (1062, "Duplicate entry '3-add_author' for key 2")

有什么问题?

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: django loaddata dumpdata


    【解决方案1】:

    (更新)

    你是对的(下面是你的 cmets)。问题确实出在auth.permission

    当您运行 syncdb 时,auth.permissionpopulated automatically with default values for all installed modelssyncdb 的任何后续运行都会为最近添加的任何模型添加新条目。

    如果在稍后阶段您重置数据库并再次运行syncdb,这些值将被重新填充,并且根据检查已安装模型的顺序,相关权限可能会以不同的顺序添加,并赋予不同的 ID来自您之前的数据库(如果模型是分阶段安装的)。

    为避免此问题,您可以在转储auth 数据时将auth.permission 排除在外(正如您在 cmets 中已经指出的那样),或者在加载数据转储之前重置auth.permission 表。

    此外,在转储数据时使用natural keys (--natural) 也很重要,这样它就不会使用其整数 id 引用相关数据(在另一个数据库中加载时可能不一样)。这个功能是introduced in Django 1.2

    【讨论】:

    • 数据库中不存在条目。我删除了旧数据库,并创建了一个新数据库(一个空数据库)。我可以以同样的方式为我的另一个应用成功转储和加载。
    • @Yuanzhong 您应该使用该信息更新您的问题。您在问题中提到的只是dumpdata,然后是loaddata,这肯定会导致IntegrityError
    • 顺便问一下,您删除了哪些表以及如何创建新表?使用./manage.py syncdb?
    • 对不起,我已经添加了更多信息。我删除了整个数据库并创建了一个新数据库。使用 ./manage.py syncdb 创建所有表。然后加载数据。
    • 我知道问题的原因。 auth.permission(add_author) 的“pk”在 old_database 和 new_database 之间是不同的(使用 manage.py syncdb 创建 auth.permission 表)。(有关详细信息,请参阅i.stack.imgur.com/PtxDu.jpg)但我不知道它们为什么不同。现在我向 dumpdata 添加一个选项“--exclude auth.permission”: > manage.py dumpdata auth > my_auth.json --natural --exclude contenttypes --exclude auth.permission 当我加载它时它工作。感谢您的回答。
    猜你喜欢
    • 2011-11-11
    • 2013-08-07
    • 2023-01-20
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2020-10-11
    • 2016-06-26
    相关资源
    最近更新 更多