【问题标题】:Duplicate column name when migrating Django database迁移 Django 数据库时列名重复
【发布时间】:2017-02-19 19:58:14
【问题描述】:

我正在尝试迁移我的数据库:

E:\PhytonProgects\natarelke>python manage.py migrate
System check identified some issues:

WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection       'default'
    HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL,     such as data truncation upon insertion, by escalating warnings into errors. It   is strongly recommended
you activate it. See: 
https://docs.djangoproject.com/en/1.10/ref/databases/#mysql-sql-mode
Operations to perform:
Apply all migrations: admin, auth, catalog, contenttypes, main, ordering,     registration, sessions, users
Running migrations:
Rendering model states... DONE
Applying catalog.0002_auto_20170219_2146...Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)

File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line   367, in execute_from_command_line
utility.execute()
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 359, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 305, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 356, in execute
output = self.handle(*args, **options)

File "C:\Python27\lib\site-packages\django\core\management\commands\migrate.py", line 202, in handle
targets, plan, fake=fake, fake_initial=fake_initial

File "C:\Python27\lib\site-packages\django\db\migrations\executor.py", line 97, in migrate
state = self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)

File "C:\Python27\lib\site-packages\django\db\migrations\executor.py", line 132, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)

File "C:\Python27\lib\site-packages\django\db\migrations\executor.py", line 237, in apply_migration
state = migration.apply(state, schema_editor)
File "C:\Python27\lib\site-packages\django\db\migrations\migration.py", line 129, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
 File "C:\Python27\lib\site-packages\django\db\migrations\operations\fields.py", line 84, in database_forwards
field,
 File "C:\Python27\lib\site-packages\django\db\backends\mysql\schema.py", line 43, in add_field
super(DatabaseSchemaEditor, self).add_field(model, field)
 File "C:\Python27\lib\site-packages\django\db\backends\base\schema.py", line 409, in add_field
self.execute(sql, params)
File "C:\Python27\lib\site-packages\django\db\backends\base\schema.py", line 112, in execute
cursor.execute(sql, params)
 File "C:\Python27\lib\site-packages\django\db\backends\utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "C:\Python27\lib\site-packages\django\db\backends\utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "C:\Python27\lib\site-packages\django\db\utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "C:\Python27\lib\site-packages\django\db\backends\utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "C:\Python27\lib\site-packages\django\db\backends\mysql\base.py", line 112, in execute
return self.cursor.execute(query, args)
File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 205, in execute
self.errorhandler(self, exc, value)
File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
django.db.utils.OperationalError: (1060, "Duplicate column name 'user_id'")

当我尝试运行 python manage.py migrate 时,我得到了上面显示的错误。谁能帮我修一下?

【问题讨论】:

  • 错误提示“列名 'user_id' 重复”。您的数据库中是否已有表?
  • 是的,我有它。但我不想放弃它,因为我已经插入了信息
  • 您当前的数据库架构是否与您的迁移(或某些版本的迁移)匹配?
  • 如何查看?在做 python 之前。 manage.py migrate 我删除了所有 mirgate 文件,而不是 python manage.py makemigrations
  • 您现有的表格是从哪里来的?迁移只能从已知状态开始,并且通过删除所有迁移文件并生成新的文件,您会失去同步......

标签: python django


【解决方案1】:

这是一个简单的问题,我也遇到过。 只是migrate 命令的问题没什么大不了的。通常,当您创建新模型或新表时,您会重新运行旧迁移以及新创建的迁移。我想这里有时 Django 会混淆。

我发现的最简单的解决方案是。

  1. 第一次清空回收站。
  2. 然后转到您的迁移文件夹(如果您有多个应用程序)
  3. 暂时删除(将0001_initial.py0002_auto_20170621_1006等所有迁移文件全部发送到回收站。

  4. 然后重新运行命令python manage.py makemigrationspython manage.py migrate

*step 3: 是临时删除。在这里你也可以回到回收站,一键轻松恢复。 (所以 del 是安全的)

【讨论】:

    【解决方案2】:

    我想告诉你我的情况。这仅在您有耐心并且确定更改时才有效。 Django 2.1

    {% for crash in crash %}

    1. python manage.py makemigrations

    2. 找到冲突文件(在问题目录.0002_auto_20170219_2146.py什么的)

    3. 暂时删除(复制到其他文件或不关闭文件)数据库中已存在的列。 (这是你必须耐心等待的:/)。

    {% endfor %}

    1. python manage.py 迁移

    2. 撤消对文件的更改。

    就是这样,对我有用。 道德:如果您发现与 migrate 冲突,您应该修复它,不要删除所有文件。

    【讨论】:

      【解决方案3】:

      您的数据库或迁移存在问题,或两者都有。如果这是一个新项目,删除数据库和所有迁移,并使用makemigrations 重新创建它们可能会让您摆脱困境。

      要保存您的数据,您可以尝试恢复为与您的数据库匹配的 models.py,并使用 dumpdata 将您的数据导出到 JSON 文件。

      【讨论】:

        猜你喜欢
        • 2016-04-08
        • 2018-03-04
        • 2015-03-06
        • 2016-10-27
        • 2014-07-30
        • 1970-01-01
        • 2013-10-13
        • 1970-01-01
        • 2014-01-13
        相关资源
        最近更新 更多