IntegrityError: (1062, Duplicate entry for key)
I was trying to purge my database, mydb
, and repopulate it to see the effects of some changes to my Django model. Then all this happened. I rolled back to my earlier model set-up, but I still get the errors.
I am no MySQL pro, and I can’t quite figure out the problem and what to do about it; I tried creating a new database with another name, but that didn’t happen. I assume that it is a problem created by my Django project.
Here is all the info:
C:\Users...>python manage.py syncdb Creating tables ... Creating table auth_permission Creating table auth_group_permissions Creating table auth_group Creating table auth_user_user_permissions Creating table auth_user_groups Creating table auth_user Creating table auth_message Creating table django_content_type Creating table django_session Creating table django_site Creating table django_admin_log Creating table forum_category Creating table forum_thread Creating table forum_post You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'me'): admin E-mail address: example@example.com Password: Password (again): Superuser created successfully. Traceback (most recent call last): File "manage.py", line 14, in execute_manager(settings) File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 438, in execute_manager utility.execute() File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 379, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "C:\Python27\lib\site-packages\django\core\management\base.py", line 191, in run_from_argv self.execute(*args, **options.__dict__) File "C:\Python27\lib\site-packages\django\core\management\base.py", line 220, in execute output = self.handle(*args, **options) File "C:\Python27\lib\site-packages\django\core\management\base.py", line 351, in handle return self.handle_noargs(**options) File "C:\Python27\lib\site-packages\django\core\management\commands\syncdb.py", line 109, in handle_noargs emit_post_sync_signal(created_models, verbosity, interactive, db) File "C:\Python27\lib\site-packages\django\core\management\sql.py", line 190, in emit_post_sync_signal interactive=interactive, db=db) File "C:\Python27\lib\site-packages\django\dispatch\dispatcher.py", line 172, in send response = receiver(signal=self, sender=sender, **named) File "C:\Python27\lib\site-packages\django\contrib\auth\management\__init__.p ", line 51, in create_permissions content_type=ctype File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 138, in create return self.get_query_set().create(**kwargs) File "C:\Python27\lib\site-packages\django\db\models\query.py", line 360, in create obj.save(force_insert=True, using=self.db) File "C:\Python27\lib\site-packages\django\db\models\base.py", line 460, in save self.save_base(using=using, force_insert=force_insert, force_update=force_up date) File "C:\Python27\lib\site-packages\django\db\models\base.py", line 553, in save_base result = manager._insert(values, return_id=update_pk, using=using) File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 195, in _insert return insert_query(self.model, values, **kwargs) File "C:\Python27\lib\site-packages\django\db\models\query.py", line 1436, in insert_query return query.get_compiler(using=using).execute_sql(return_id) File "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py", line 791, in execute_sql cursor = super(SQLInsertCompiler, self).execute_sql(None) File "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py", line 735, in execute_sql cursor.execute(sql, params) File "C:\Python27\lib\site-packages\django\db\backends\util.py", line 34, in execute return self.cursor.execute(sql, params) File "C:\Python27\lib\site-packages\django\db\backends\mysql\base.py", line 86, in execute return self.cursor.execute(query, args) File "C:\Users\me\AppData\Roaming\Python\Python27\site-packages\MySQLdb\cursors.py", line 174, in execute self.errorhandler(self, exc, value) File "C:\Users\me\AppData\Roaming\Python\Python27\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler raise errorclass, errorvalue django.db.utils.IntegrityError: (1062, "Duplicate entry '9-delete_category' for key 'content_type_id'")
#models.py from django.db import models from django.contrib.auth.models import User class Category(models.Model): title = models.CharField(max_length=80) class Meta: verbose_name_plural = "categories" permissions = ( ("create_category", "Can create new categories"), ("edit_category", "Can edit the titles of categories"), ("delete_category", "Can delete a category"), ("merge_category", "Can merge multiple categories together"), ) class Thread(models.Model): creation_date = models.DateTimeField() author = models.ForeignKey(User) title = models.CharField(max_length=80) category = models.ForeignKey(Category) class Meta: ordering = ["-creation_date"] permissions = ( ("create_thread", "Create new threads"), ("edit_thread", "Edit thread titles"), ("delete_thread", "Delete threads"), ("merge_thread", "Merge multiple threads together"), ("lock_thread", "Lock threads"), ("unlock_thread", "Open locked threads"), ("ban开发者_运维问答_user_in_thread", "Ban user from post in thread"), ("timeout_user_in_thread", "Ban user from posting in thread temporarily"), ("appoint_threadmin", "Give a user mod-like permissions in a thread"), ) class Bookmark(models.Model): user = models.ForeignKey(User) thread = models.ForeignKey(Thread) class Subscription(models.Model): user = models.ForeignKey(User) thread = models.ForeignKey(Thread) class Post(models.Model): creation_date = models.DateTimeField() author = models.ForeignKey(User) thread = models.ForeignKey(Thread) content = models.TextField() class Meta: ordering = ["creation_date"] permissions = ( ("create_post", "Can create new post"), ("edit_post", "Can edit all users' posts"), ("delete_post", "Can delete posts"), )
+----------------------------+ | Tables_in_mydb | +----------------------------+ | auth_group | | auth_group_permissions | | auth_message | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_session | | django_site | | forum_bookmark | | forum_category | | forum_post | | forum_subscription | | forum_thread | +----------------------------+ mysql> select * from django_content_type; +----+--------------+--------------+--------------+ | id | name | app_label | model | +----+--------------+--------------+--------------+ | 1 | permission | auth | permission | | 2 | group | auth | group | | 3 | user | auth | user | | 4 | message | auth | message | | 5 | content type | contenttypes | contenttype | | 6 | session | sessions | session | | 7 | site | sites | site | | 8 | log entry | admin | logentry | | 9 | category | forum | category | | 10 | thread | forum | thread | | 11 | bookmark | forum | bookmark | | 12 | subscription | forum | subscription | | 13 | post | forum | post | +----+--------------+--------------+--------------+
Django automatically creates few default permissions on every model, these are: add
, delete
and change
. You are getting integrity error because you are trying to create permissions with the same name. Just remove delete_***
from your Meta description and everything should be ok.
The accepted answer solves the original question and is a good starting point for others that have come to this page looking for the particular error.
To add to this for future reference, in case this is not an issue of the specific permissions but a general fixture loading order issue, this can be solved with using 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
...
精彩评论