2016-03-15 2 views
5

Я изменил мои модели я попытался перенести их, но получил эту ошибку:Дубликат имя столбца

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'") 

Это мои модели:

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') 

Что не так?

миграции файл

# -*- 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'), 
     ), 
    ] 
+2

Вы можете показать файл миграции 0002_auto_20160315_1544'? – Sayse

+0

Можете ли вы показать свой первый файл миграции ('0001_initial')? – GwynBleidD

+0

http://pastebin.com/wzyDZFSv – Bootuz

ответ

0

Просто нашли решение! Я удалил все мои миграции с 0001_initial, а затем запустил makemigrations и migrate и все внесенные изменения!

+3

Удаление всех миграций не является хорошим решением, особенно если это производственная база данных. Вы могли бы попытаться подделать свои миграции – Ankush

3

Я буду считать, что у Вас есть предыдущая миграции, в которой вы уже добавили short_description_eng поле. Вы можете проверить это, просмотрев предыдущие файлы миграции для строки 'short_description_eng'. Если это правда, вы можете просто удалить следующее из файла миграции 0002_auto_20160315_1544.

migrations.AddField(
    model_name='words', 
    name='short_description_eng', 
    field=models.CharField(blank=True, default='', max_length=100, verbose_name='Условное обозначение Eng'), 
), 

Если это не так, то его возможно вы получили вашу базу данных в foobar'ed состоянии и может быть стоит его удаления (при условии, что это база данных разработки) и ее воссоздания.

+0

Могу ли я создать резервную копию моих данных, а затем воссоздать db, а затем восстановить данные? – Bootuz

+1

@AstemirBoziev - Возможно, с ['dumpdata'] (https://docs.djangoproject.com/en/1.9/ref/django-admin/#dumpdata) и [' loaddata'] (https: //docs.djangoproject .com/en/1.9/ref/django-admin/# loaddata), хотя, вероятно, более безопасно сначала создать отдельную базу данных и изменить свои настройки, чтобы использовать эту новую базу данных, чтобы выяснить, устраняет ли она проблему. – Sayse

4

У меня была та же проблема. По сути, причина в том, что миграция считает, что в базе данных есть эти столбцы, но это не так, поэтому вам нужна процедура для удаления этих несуществующих столбцов из записей миграции.

1.Комментируйте эти столбцы в своем коде.

2.Reset миграции.

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete 
find . -path "*/migrations/*.pyc" -delete 

3. Нормальная первоначальная миграция.

python manage.py makemigrations 
python manage.py migrate 

4.В своем коде раскоментируйте эти повторяющиеся столбцы.

python manage.py makemigrations 
python manage.py migrate --fake 

5. Теперь ваши миграции и код находятся на одной странице. Я использую подделку, чтобы позволить миграции верить, что DB имеет эти столбцы, но на самом деле DB нет.

6.В своем коде прокомментируйте эти повторяющиеся столбцы еще раз.

python manage.py makemigrations 
python manage.py migrate 

7. Вот, вы успешно удалите эти записи столбцов из миграций. А также в вашем коде эти столбцы прокомментированы. Они находятся на одной странице.

8.Учитайте эти столбцы снова в своем коде и выполните миграцию.

python manage.py makemigrations 
python manage.py migrate 

9.Это должно тогда работать.

Это единственный способ, который сработал для моей ситуации. Я надеюсь, что другие могут обеспечить более легкий подход.

Смежные вопросы