Duplicate column name

匿名 (未验证) 提交于 2019-12-03 08:44:33

问题:

I've changed my models an then I tried to migrate them, but got this error:

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

This is my models:

Whats wrong?

Migration file

回答1:

I had the same issue. Basically, the reason is because the migration thinks the database has those columns but the DB actually does not, so you need a procedure to delete those non-existent columns from migration records.

1.Comment those columns in your code.

2.Reset migrations.

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

3.Do normal initial migration.

python manage.py makemigrations python manage.py migrate 

4.In your code, uncomment those duplicate columns.

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

5.Now your migrations and code are on same page. I use fake to let migration believe DB has those column, but indeed DB does not.

6.In your code, comment those duplicate column again.

python manage.py makemigrations python manage.py migrate 

7.Here, you successfully delete those column records from migrations. And also in your code, those column are commented. They are on the same page.

8.Uncomment those columns again in your code and do migrations.

python manage.py makemigrations python manage.py migrate 

9.It should then work.

This is the only way that worked for my situation. I hope others can provide an easier approach.



回答2:

I'm going to assume that you have a previous migration in which you've already added the short_description_eng field. You could check this by looking through the previous migration files for the string 'short_description_eng'. If thats True, you can just delete the following from the 0002_auto_20160315_1544 migration file.

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

If that isn't the case then its possible you've got your database in a foobar'ed state and it may be worth deleting it (assuming this is a development database) and recreating it.



回答3:

Just found the solution! I deleted all my migrations with 0001_initial, and then run makemigrations and migrate and all the changes apllied!



回答4:

When I had this issue, I had to go to each migration that said it had a duplicate column and merge the 0002_*.py migration file with the 0001_initial.py migration file.

1. Copy all the operations in the operations = [] list and paste them into the operations = [] list in the 0001_initial.py file.

2. If you had other dependencies besides 0001_initial, you would copy all the lines in dependencies = [] (except the line that says('myapp', '0001_initial'),) migrations from the list of dependencies and paste them into the 0001_initial.py migration file.

Important Note: Make sure you grab any import dependencies too. I had no issues after following those simple steps.



文章来源: Duplicate column name
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!