【问题标题】:Django database migration error: duplicate keyDjango 数据库迁移错误:重复键
【发布时间】:2016-04-08 11:31:51
【问题描述】:

我正在迁移数据库,但不确定为什么会出现此错误。有谁知道如何解决这一问题?在此之前,我使用 mysql 创建了一个新数据库并授予用户访问权限。我之前有一个工作数据库,但应用程序不工作(将 OSX 升级到 El Capitan)所以我重新做了。我不确定我是否正确创建了新数据库。

> (env)DNab4046b2:VisualGenomeDev gmaister$ python manage.py migrate
> /Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/test/_doctest.py:59:
> RemovedInDjango18Warning: The django.test._doctest module is
> deprecated; use the doctest module from the Python standard library
> instead.   RemovedInDjango18Warning)
> 
> /Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/test/simple.py:27:
> RemovedInDjango18Warning: The django.test.simple module and
> DjangoTestSuiteRunner are deprecated; use
> django.test.runner.DiscoverRunner instead.   RemovedInDjango18Warning)
> 
> Operations to perform:   Synchronize unmigrated apps: lockdown,
> django_extensions, corsheaders, rest_framework   Apply all migrations:
> hits, sessions, V6W, djcelery, contenttypes, auth, sites, admin,
> DataAnalysis, RegionAnnotations, common, UserManagement, Sentences,
> Clusters, Evaluation, Canonicalization Synchronizing apps without
> migrations:   Creating tables...   Installing custom SQL...  
> Installing indexes... Running migrations:   Applying
> RegionAnnotations.0005_auto_20150716_1133...Traceback (most recent
> call last):   File "manage.py", line 10, in <module>
>     execute_from_command_line(sys.argv)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/core/management/__init__.py",
> line 385, in execute_from_command_line
>     utility.execute()   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/core/management/__init__.py",
> line 377, in execute
>     self.fetch_command(subcommand).run_from_argv(self.argv)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/core/management/base.py",
> line 288, in run_from_argv
>     self.execute(*args, **options.__dict__)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/core/management/base.py",
> line 338, in execute
>     output = self.handle(*args, **options)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/core/management/commands/migrate.py",
> line 160, in handle
>     executor.migrate(targets, plan, fake=options.get("fake", False))   File
> "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/migrations/executor.py",
> line 63, in migrate
>     self.apply_migration(migration, fake=fake)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/migrations/executor.py",
> line 97, in apply_migration
>     migration.apply(project_state, schema_editor)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/migrations/migration.py",
> line 107, in apply
>     operation.database_forwards(self.app_label, schema_editor, project_state, new_state)   File
> "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/migrations/operations/fields.py",
> line 131, in database_forwards
>     schema_editor.alter_field(from_model, from_field, to_field)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/backends/schema.py",
> line 509, in alter_field
>     self._alter_field(model, old_field, new_field, old_type, new_type, old_db_params, new_db_params, strict)   File
> "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/backends/schema.py",
> line 692, in _alter_field
>     "extra": "",   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/backends/schema.py",
> line 98, in execute
>     cursor.execute(sql, params)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/backends/utils.py",
> line 81, in execute
>     return super(CursorDebugWrapper, self).execute(sql, params)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/backends/utils.py",
> line 65, in execute
>     return self.cursor.execute(sql, params)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/utils.py",
> line 94, in __exit__
>     six.reraise(dj_exc_type, dj_exc_value, traceback)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/backends/utils.py",
> line 65, in execute
>     return self.cursor.execute(sql, params)   File "/Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/db/backends/mysql/base.py",
> line 128, in execute
>     return self.cursor.execute(query, args)   File "/Library/Python/2.7/site-packages/MySQLdb/cursors.py", line 205, in
> execute
>     self.errorhandler(self, exc, value)   File "/Library/Python/2.7/site-packages/MySQLdb/connections.py", line 36,
> in defaulterrorhandler
>     raise errorclass, errorvalue django.db.utils.OperationalError: (1061, "Duplicate key name
> 'RegionAnnotations_regionannotation_phrase_ffbaf771d98f6cc_uniq'")

【问题讨论】:

  • 您可能必须删除您的数据库并从头开始创建一个新数据库。有些数据卡在您的旧数据库中,您的迁移会添加更多违反唯一性的数据。
  • 我有同样的错误,如果您阅读该错误,它会告诉您您有一个重复的键名。这意味着您正在尝试在数据库中创建一个新的(唯一)索引,其名称已经存在。还不知道如何修复它......但删除数据库不应该解决问题(但可能值得一试)

标签: mysql django database-migration on-duplicate-key


【解决方案1】:

我刚刚遇到了这个错误,我可以通过使用这些 SQL 命令删除错误中命名的索引来解决它:

mysql> DROP INDEX [index_name] ON [table_name];

所以在你的情况下:

mysql> DROP INDEX RegionAnnotations_regionannotation_phrase_ffbaf771d98f6cc_uniq ON RegionAnnotations_regionannotation;

【讨论】:

  • 不知道为什么这被否决了。为我工作并解决我的问题。
  • 当您在之前的迁移中添加了 db_index=True 时会发生这种情况。上述解决方案对我有用。
  • MySQL 说:#1553 - Cannot drop index '[index_name]': needed in a foreign key constraint
【解决方案2】:

如果此问题仅限于特定应用,您可以简单地伪造迁移(不是最佳实践):

python manage.py migrate [my_app_name] --fake

所以在你的情况下:

python manage.py migrate RegionAnnotations --fake

【讨论】:

    【解决方案3】:

    您可以只调整应用中的迁移文件,删除列的唯一性。

    例如在我的问题中:

    # Generated by Django 2.2 on 2020-04-14 19:17
    
    from django.db import migrations, models
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('app_chapters', '0007_auto_20200414_2100'),
        ]
    
        operations = [
            migrations.AlterField(
                model_name='chapter',
                name='order',
                field=models.IntegerField(unique=True),
            ),
            migrations.AlterField(
                model_name='chapter',
                name='revelation_order',
                field=models.IntegerField(),
            ),
        ]
    
    

    改为

    # Generated by Django 2.2 on 2020-04-14 19:17
    
    from django.db import migrations, models
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('app_chapters', '0007_auto_20200414_2100'),
        ]
    
        operations = [
            migrations.AlterField(
                model_name='chapter',
                name='revelation_order',
                field=models.IntegerField(),
            ),
        ]
    
    

    另一个建议的解决方案是尽可能修改 phpMyAdmin 或 pgAdmin 中的 SQL 数据库。

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 2015-08-08
      • 2019-01-09
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 2015-06-08
      • 2015-04-06
      相关资源
      最近更新 更多