Схема миграции с юга (django) и MySQL - PullRequest
1 голос
/ 13 октября 2011

Я только что прошел учебник по django и следовал каждому шагу, но все равно получаю эту ошибку каждый раз, когда пытаюсь выполнить миграцию:

Первоначальная миграция работает, но пытаясь ее перенести, яполучить это:

  root@debian:/Sites/tumblog# ./manage.py migrate blog

   Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_manager(settings)
  File "/usr/lib/pymodules/python2.6/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/usr/lib/pymodules/python2.6/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/usr/lib/pymodules/python2.6/south/management/commands/migrate.py", line 102, in handle
    delete_ghosts = delete_ghosts,
  File "/usr/lib/pymodules/python2.6/south/migration/__init__.py", line 202, in migrate_app
    success = migrator.migrate_many(target, workplan, database)
  File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 215, in migrate_many
    result = migrator.__class__.migrate_many(migrator, target, migrations, database)
  File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 284, in migrate_many
    result = self.migrate(migration, database)
  File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 121, in migrate
    result = self.run(migration)
  File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 95, in run
    return self.run_migration(migration)
  File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 77, in run_migration
    migration_function()
  File "/usr/lib/pymodules/python2.6/south/migration/migrators.py", line 56, in <lambda>
    return (lambda: direction(orm))
  File "/Site/tumblog/blog/migrations/0005_initial.py", line 17, in forwards
    ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
  File "/usr/lib/pymodules/python2.6/south/db/generic.py", line 210, in create_table
    ', '.join([col for col in columns if col]),
  File "/usr/lib/pymodules/python2.6/south/db/generic.py", line 134, in execute
    cursor.execute(sql, params)
  File "/usr/lib/pymodules/python2.6/django/db/backends/util.py", line 15, in execute
    return self.cursor.execute(sql, params)
  File "/usr/lib/pymodules/python2.6/django/db/backends/mysql/base.py", line 86, in execute
    return self.cursor.execute(query, args)
  File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 166, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 35, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1050, "Table 'blog_blog' already exists")

Я искал и обнаружил, что добавление --fake пропустит эту ошибку, но это ничего не изменит?В чем проблема и как ее исправить?

Ответы [ 3 ]

3 голосов
/ 14 октября 2011

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

Подозрительно название миграции - 0005_initial.Что делают миграции 0001-0004?

Чтобы решить вашу проблему, сначала убедитесь, что у вас нет повторяющихся миграций (например, 0001_initial создает таблицы, а затем 0005_initial пытается сделать это снова).Для приложения вам понадобится только одна начальная миграция, следующие должны записывать только изменения в схеме.

Затем удалите таблицы из базы данных и создайте их заново.Нечто подобное может сработать:

./manage.py migrate [appname] --fake
./manage.py migrate [appname] zero
./manage.py migrate [appname]

Если это не удастся (будет, если в миграции есть как существующие, так и новые таблицы) - тогда вам придется отбрасывать таблицы вручную в консоли mysql.

3 голосов
/ 14 октября 2011

Вы уверены, что добавление --fake ничего не меняет?

manage.py migrate blog --fake

... или удалить таблицу 'blog_blog' вручную из консоли mysql;)

1 голос
/ 14 октября 2011

Что на самом деле происходит в ваших миграциях?Если вы получаете эту ошибку, то просто create_table вызывается дважды для blog_blog или blog_blog, уже существовавшего в вашей базе данных до первоначальной миграции (возможно, остаток от предыдущей попытки создать блог, который никогда не переносилсяв ноль).

Если ошибка происходит до завершения начальной миграции, то это, скорее всего, артефакт, и вы можете просто удалить его из базы данных вручную и повторить попытку.Если первоначальная миграция прошла успешно, но более поздняя миграция не удалась, найдите место, где есть дубликат create_table для blog_blog.

...