IntegrityError:(1062,键的重复条目)

Posted

技术标签:

【中文标题】IntegrityError:(1062,键的重复条目)【英文标题】:IntegrityError: (1062, Duplicate entry for key) 【发布时间】:2011-11-11 12:18:41 【问题描述】:

我试图清除我的数据库mydb,并重新填充它以查看对我的 Django 模型进行一些更改的效果。然后这一切就发生了。我回滚到我之前的模型设置,但我仍然收到错误。

我不是 mysql 专业人士,我无法完全弄清楚问题所在以及如何解决它;我尝试用另一个名称创建一个新数据库,但没有发生。我认为这是我的 Django 项目造成的问题。

这里是所有信息:

C:\用户...>python manage.py syncdb 创建表... 创建表 auth_permission 创建表 auth_group_permissions 创建表 auth_group 创建表 auth_user_user_permissions 创建表 auth_user_groups 创建表 auth_user 创建表 auth_message 创建表 django_content_type 创建表 django_session 创建表 django_site 创建表 django_admin_log 创建表 forum_category 创建表 forum_thread 创建表 forum_post 您刚刚安装了 Django 的身份验证系统,这意味着您没有定义任何超级用户。 您想现在创建一个吗? (是/否):是 用户名(留空以使用“我”):管理员 电子邮件地址:example@example.com 密码: 密码(再次): 超级用户创建成功。 回溯(最近一次通话最后): 文件“manage.py”,第 14 行,在 执行管理器(设置) 文件“C:\Python27\lib\site-packages\django\core\management\__init__.py”,第 438 行,在 execute_manager utility.execute() 文件“C:\Python27\lib\site-packages\django\core\management\__init__.py”,第 379 行,执行 self.fetch_command(subcommand).run_from_argv(self.argv) 文件“C:\Python27\lib\site-packages\django\core\management\base.py”,第 191 行,在 run_from_argv self.execute(*args, **options.__dict__) 文件“C:\Python27\lib\site-packages\django\core\management\base.py”,第 220 行,在执行输出 = self.handle(*args, **options) 文件“C:\Python27\lib\site-packages\django\core\management\base.py”,第 351 行,在句柄返回 self.handle_noargs(**options) 文件“C:\Python27\lib\site-packages\django\core\management\commands\syncdb.py”,第 109 行,在 handle_noargs emit_post_sync_signal(created_models, verbosity, interactive, db) 文件“C:\Python27\lib\site-packages\django\core\management\sql.py”,第 190 行,在 emit_post_sync_signal interactive=interactive, db=db) 文件“C:\Python27\lib\site-packages\django\dispatch\dispatcher.py”,第 172 行,在发送响应 = 接收器(信号 = 自我,发件人 = 发件人,**命名) 文件“C:\Python27\lib\site-packages\django\contrib\auth\management\__init__.p”,第 51 行,在 create_permissions content_type=ctype 文件“C:\Python27\lib\site-packages\django\db\models\manager.py”,第 138 行,在 create return self.get_query_set().create(**kwargs) 文件“C:\Python27\lib\site-packages\django\db\models\query.py”,第 360 行,创建 obj.save(force_insert=True, using=self.db) 文件“C:\Python27\lib\site-packages\django\db\models\base.py”,第 460 行,保存 self.save_base(using=using, force_insert=force_insert, force_update=force_up 日期) 文件“C:\Python27\lib\site-packages\django\db\models\base.py”,第 553 行,在 save_base 结果 = manager._insert(values, return_id=update_pk, using=using) 文件“C:\Python27\lib\site-packages\django\db\models\manager.py”,第 195 行,在 _insert return insert_query(self.model, values, **kwargs) 文件“C:\Python27\lib\site-packages\django\db\models\query.py”,第 1436 行,在 insert_query return query.get_compiler(using=using).execute_sql(return_id) 文件“C:\Python27\lib\site-packages\django\db\models\sql\compiler.py”,第 791 行,在 execute_sql cursor = super(SQLInsertCompiler, self).execute_sql(None) 文件“C:\Python27\lib\site-packages\django\db\models\sql\compiler.py”,第 735 行,在 execute_sql cursor.execute(sql, params) 文件“C:\Python27\lib\site-packages\django\db\backends\util.py”,第 34 行,在执行 return self.cursor.execute(sql, params) 文件“C:\Python27\lib\site-packages\django\db\backends\mysql\base.py”,第 86 行,在执行中返回 self.cursor.execute(query, args) 文件“C:\Users\me\AppData\Roaming\Python\Python27\site-packages\MySQLdb\cursors.py”,第 174 行,执行 self.errorhandler(self, exc, value) 文件“C:\Users\me\AppData\Roaming\Python\Python27\site-packages\MySQLdb\connections.py”,第 36 行,在 defaulterrorhandler 中引发 errorclass,errorvalue django.db.utils.IntegrityError:(1062,“重复条目'9-delete_category'键'content_type_id'”) #models.py 从 django.db 导入模型 从 django.contrib.auth.models 导入用户 类类别(模型。模型): 标题 = models.CharField(max_length=80) 元类: verbose_name_plural = "类别" 权限 = ( ("create_category", "可以创建新类别"), ("edit_category", "可以编辑类别的标题"), ("delete_category", "可以删除一个类别"), ("merge_category", "可以合并多个类别"), ) 类线程(模型。模型): creation_date = models.DateTimeField() 作者 = 模型。外键(用户) 标题 = models.CharField(max_length=80) 类别=模型.ForeignKey(类别) 元类: 排序 = [“-creation_date”] 权限 = ( ("create_thread", "创建新线程"), ("edit_thread", "编辑线程标题"), ("delete_thread", "删除线程"), ("merge_thread", "合并多个线程"), ("lock_thread", "锁定线程"), ("unlock_thread", "打开锁定的线程"), ("ban_user_in_thread", "禁止用户在线程中发帖"), ("timeout_user_in_thread", "暂时禁止用户发帖"), ("appoint_threadmin", "在线程中授予用户类似 mod 的权限"), ) 类书签(模型。模型): 用户 = 模型。外键(用户) 线程 = 模型.ForeignKey(线程) 类订阅(模型。模型): 用户 = 模型。外键(用户) 线程 = 模型.ForeignKey(线程) 类帖子(模型。模型): creation_date = models.DateTimeField() 作者 = 模型。外键(用户) 线程 = 模型.ForeignKey(线程) 内容 = 模型.TextField() 元类: 订购 = [“创作日期”] 权限 = ( ("create_post", "可以创建新帖子"), ("edit_post", "可以编辑所有用户的帖子"), ("delete_post", "可以删除帖子"), ) +----------------------------+ | Tables_in_mydb | +----------------------------+ | auth_group | | auth_group_permissions | | auth_message | | auth_permission | |身份验证用户 | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_session | | django_site | |论坛书签 | |论坛_类别 | |论坛帖子 | |论坛订阅 | |论坛线程 | +----------------------------+ mysql> 从 django_content_type 中选择 *; +----+--------------+--------------+-------------- + |编号 |姓名 |应用标签 |型号 | +----+--------------+--------------+-------------- + | 1 |许可 |认证 |许可 | | 2 |集团 |认证 |集团 | | 3 |用户 |认证 |用户 | | 4 |留言 |认证 |留言 | | 5 |内容类型 |内容类型 |内容类型 | | 6 |会议 |会议 |会议 | | 7 |网站 |网站 |网站 | | 8 |日志条目 |管理员 |登录 | | 9 |类别 |论坛 |类别 | | 10 |线程 |论坛 |线程 | | 11 |书签 |论坛 |书签 | | 12 |订阅 |论坛 |订阅 | | 13 |发布 |论坛 |发布 | +----+--------------+--------------+-------------- +

【问题讨论】:

听起来外键检查失败。 content_type_id 在哪里用作外键? 您可以在第 86 行之前编辑 C:\Python27\lib\site-packages\django\db\backends\mysql\base.py,添加 print query % args,然后重新运行 syncdb 以查看在失败之前运行了哪些查询。 '9-delete_category' 值肯定不适合 'content_type_id' 字段。 【参考方案1】:

接受的答案解决了最初的问题,并且对于来到此页面寻找特定错误的其他人来说是一个很好的起点。

添加到这里以供将来参考,如果这不是特定权限的问题,而是一般的夹具加载顺序问题,可以使用 call_command 来解决:

from django.test import TestCase
from django.core.management import call_command


class Tests(TestCase):
    @classmethod
    def setUpTestData(cls):
        # do some early data setup
        ...
        # then load data
        call_command('loaddata', 'myfixture', verbosity=0)

    def mytest(self):
        # some tests in here
        ...

【讨论】:

这是完美的解决方案。请注意 setUpTestData 在 Django 1.8 之后可用 docs.djangoproject.com/en/1.8/topics/testing/tools/…【参考方案2】:

Django 在每个模型上自动 creates few default permissions,它们是:adddeletechange。您收到完整性错误,因为您尝试创建具有相同名称的权限。只需从您的元描述中删除 delete_***,一切都会好起来的。

【讨论】:

以上是关于IntegrityError:(1062,键的重复条目)的主要内容,如果未能解决你的问题,请参考以下文章

mysql IntegrityError: (pymysql.err.IntegrityError) (1062, "Duplicate entry '000001.SZ-2018-

错误 #1062 主键的 Mysql 重复条目

pymysql.err.IntegrityError: (1062, "Duplicate entry 'roxml-ROXML' for key 'PRIMARY&

mysql插入数据报错IntegrityError: (1062, "Duplicate entry 'xx' for key 'xxxxx'")

SQLSTATE [23000]:违反完整性限制:1062 'mail@mail.com' 'users_email_unique' 键的重复条目

使用用户名 = 电子邮件保存用户时出现 IntegrityError