Django: перенести таблицу 'forum_user' уже существует - PullRequest
8 голосов
/ 21 февраля 2012

Я изменил модели Django и использую Django schemamigration для обновления базы данных.Но когда я делаю python manager.py migrate app, он выдает это сообщение об ошибке:

_mysql_exceptions.OperationalError: (1050, "Table 'forum_user' already exists")

Ответы [ 2 ]

26 голосов
/ 21 февраля 2012

Тогда таблица, которую пытается создать django south, уже существует и не соответствует состоянию вашей базы данных.

Если вы выполняете миграцию впервые, помните, что прежде чем вносить изменения в схемы, вы должны установить начальное состояние с помощью schemamigration myapp --initial и migrate app --fake, чтобы база данных соответствовала южному состоянию базы данных.

manage.py convert_to_south myapp также делает вышеперечисленное в качестве удобного метода.

Чтобы начать использовать юг ...

  1. Убедитесь, что ваши таблицы django точно соответствуют вашим текущим таблицам базы данных - если вы планируете добавлять или удалять столбцы, закомментируйте их.
  2. Запустить python manage.py schemamigration myapp --initial
  3. Запустите python manage.py migrate myapp --fake
  4. Внесите изменения в модель django
  5. Запустите python manage.py schemamigration myapp --auto
  6. Запустите python manage.py migrate myapp

Обновление

Примечание: корабли django 1.7+ с миграциями и югом больше не используются.

Стоит отметить только две команды ..

  • manage.py makemigrations (handles --initial)
  • manage.py migrate

Написано тем же автором, что и Юг, финансируется толпой. Иди джанго.

0 голосов
/ 26 мая 2015

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

Ключом к успеху было создание --empty миграции до добавления новых моделей. Поток:

  • Слияние с другими людьми, которые исключают информацию о модели, которую я имею на месте.
  • normal schemamigration --auto снова добавлял таблицу / модель и вызывал «ошибку уже существует».
  • Решено путем комментирования новой модели и запуска пустой миграции через clear; python manage.py schemamigration --empty APPNAME MIGRATION_FILE_NAME. Это создает «декларацию» о состоянии моделей без команд вперед / назад. Будьте на 100% уверены, что текущее состояние моделей (файлов Python) и базы данных синхронизировано !!! Эта самая последняя миграция будет использоваться для создания дифференциала для корректной миграции (следующая).
  • раскомментируйте новую модель и запустите clear; python manage.py schemamigration APPNAME --auto, чтобы создать отключение истинного и желаемого дифференциала (используется только что созданная миграция --empty). Новая миграция будет иметь команды вперед / назад, которые должны соответствовать вашей новой модели. Обзор ...
  • закончить с clear; python manage.py migrate

Извлеченный урок состоит в том, что --auto просматривает последний файл миграции APP + для создания различий вперед / назад. Если последняя миграция НЕ содержит в словаре модель, которую вы имеете в БД, она будет создана снова, вызывая ошибку «уже существует». Думайте о словаре как о контракте между Django и БД, в котором говорится "вот как все должно выглядеть". Миграция может включать команды, которые создают дубликаты таблиц и будут доступны только во время команды `` migrate``.

Приведенная выше информация должна решить проблему. Представлено частично, чтобы помочь людям, а также для проверки на случай, если я делаю что-то глупое.

...