我已经改变了我的模型然后我试图迁移它们,但是得到了这个错误:
python manage.py migrate
Operations to perform:
Apply all migrations: admin, contenttypes, auth, sessions, myapp
Running migrations:
Rendering model states... DONE
Applying myapp.0002_auto_20160315_1544...Traceback (most recent call last):
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/backends/mysql/base.py", line 112, in execute
return self.cursor.execute(query, args)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 226, in execute
self.errorhandler(self, exc, value)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorvalue
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 217, in execute
res = self._query(query)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 378, in _query
rowcount = self._do_query(q)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 341, in _do_query
db.query(q)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/connections.py", line 280, in query
_mysql.connection.query(self, query)
_mysql_exceptions.OperationalError: (1060, "Duplicate column name 'short_description_eng'")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
utility.execute()
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/core/management/__init__.py", line 345, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/core/management/base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/core/management/base.py", line 399, in execute
output = self.handle(*args, **options)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 200, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/migrations/executor.py", line 92, in migrate
self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/migrations/executor.py", line 121, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/migrations/executor.py", line 198, in apply_migration
state = migration.apply(state, schema_editor)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/migrations/migration.py", line 123, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/migrations/operations/fields.py", line 62, in database_forwards
field,
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/backends/mysql/schema.py", line 50, in add_field
super(DatabaseSchemaEditor, self).add_field(model, field)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 396, in add_field
self.execute(sql, params)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 110, in execute
cursor.execute(sql, params)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/utils.py", line 95, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/utils/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/django/db/backends/mysql/base.py", line 112, in execute
return self.cursor.execute(query, args)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 226, in execute
self.errorhandler(self, exc, value)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorvalue
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 217, in execute
res = self._query(query)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 378, in _query
rowcount = self._do_query(q)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 341, in _do_query
db.query(q)
File "/home/bootuz/final/myvenv/lib/python3.4/site-packages/MySQLdb/connections.py", line 280, in query
_mysql.connection.query(self, query)
django.db.utils.OperationalError: (1060, "Duplicate column name 'short_description_eng'")
Run Code Online (Sandbox Code Playgroud)
这是我的模特:
class Words(models.Model):
title = models.CharField(max_length=100, unique=True, verbose_name='?????')
audio = models.FileField(upload_to='audio', blank=True, verbose_name='???????')
short_description_rus = models.CharField(max_length=100, default='', blank=True, verbose_name='???????? ??????????? ???')
russian = models.TextField(default='', blank=True, verbose_name='???????')
short_description_eng = models.CharField(max_length=110, default='', blank=True, verbose_name='???????? ??????????? Eng')
english = models.TextField(default='', blank=True, verbose_name='English')
short_description_tur = models.CharField(max_length=100, default='', blank=True, verbose_name='???????? ??????????? Tür')
turkish = models.TextField(default='', blank=True, verbose_name='Türkçe')
Run Code Online (Sandbox Code Playgroud)
怎么了?
迁移文件
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-15 15:44
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='words',
name='short_description_eng',
field=models.CharField(blank=True, default='', max_length=100, verbose_name='???????? ??????????? Eng'),
),
migrations.AddField(
model_name='words',
name='short_description_rus',
field=models.CharField(blank=True, default='', max_length=100, verbose_name='???????? ??????????? ???'),
),
migrations.AddField(
model_name='words',
name='short_description_tur',
field=models.CharField(blank=True, default='', max_length=100, verbose_name='???????? ??????????? Tür'),
),
migrations.AlterField(
model_name='words',
name='audio',
field=models.FileField(blank=True, upload_to='audio', verbose_name='???????'),
),
migrations.AlterField(
model_name='words',
name='english',
field=models.TextField(blank=True, default='', verbose_name='English'),
),
migrations.AlterField(
model_name='words',
name='russian',
field=models.TextField(blank=True, default='', verbose_name='???????'),
),
migrations.AlterField(
model_name='words',
name='title',
field=models.CharField(max_length=100, unique=True, verbose_name='?????'),
),
migrations.AlterField(
model_name='words',
name='turkish',
field=models.TextField(blank=True, default='', verbose_name='Türkçe'),
),
]
Run Code Online (Sandbox Code Playgroud)
Jia*_*Cao 10
我遇到过同样的问题.基本上,原因是迁移认为数据库具有那些列但数据库实际上没有,因此您需要一个过程来从迁移记录中删除那些不存在的列.
1.在代码中查看这些列.
2.重置迁移.
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
Run Code Online (Sandbox Code Playgroud)
3.进行正常的初始迁移.
python manage.py makemigrations
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
4.在您的代码中,取消注释这些重复的列.
python manage.py makemigrations
python manage.py migrate --fake
Run Code Online (Sandbox Code Playgroud)
5.现在您的迁移和代码在同一页面上.我使用假的让迁移相信DB有那些列,但实际上DB没有.
6.在您的代码中,再次注释这些重复列.
python manage.py makemigrations
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
7.在这里,您成功从迁移中删除了这些列记录.在您的代码中,这些列也会被评论.它们在同一页面上.
8.在代码中再次取消注释这些列并执行迁移.
python manage.py makemigrations
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
那应该工作了.
这是对我的情况有用的唯一方法.我希望其他人可以提供更简单的方法.
您尝试运行的迁移给人的印象是数据库中存在某个实际上并不存在的列,因为您在某个时候删除了它。因此,您需要通过伪造来回滚迁移,以“说服”数据库存在迁移,然后重新应用迁移。
假设您的应用中有这些迁移myapp:
您将需要将迁移回滚到列仍然存在的点。请注意,如果您在 prod 数据库中,您应该意识到这样做可能导致的潜在数据丢失。
如果您删除了 中的列0003_removedcolumn.py,则需要运行:python manage.py migrate --fake myapp 0002_something。
然后,您可以重新运行顺序迁移: python manage.py migrate myapp。你的问题现在应该解决了!
从这里,你可以运行python manage.py makemigrations,它应该运行顺利。
小智 6
我遇到了同样的问题。
我刚刚python3 manage.py migrate appname --fake从https://github.com/BirkbeckCTP/janeway/issues/451尝试过,它对我有用。