Почему мои южные миграции не работают?

Сначала я создаю свою базу данных.

create database mydb;

Я добавляю "юг" в установленные приложения. Затем я перехожу к этому учебнику: http://south.aeracode.org/docs/tutorial/part1.html

Учебник говорит мне сделать это:

$ py manage.py  schemamigration wall --initial
>>> Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate wall

Отлично, теперь я мигрирую.

$ py manage.py migrate wall

Но это дает мне эту ошибку...

django.db.utils.DatabaseError: (1146, "Table 'fable.south_migrationhistory' doesn't exist")

Поэтому я использую Google (который никогда не работает. Отсюда мои 870 вопросов, задаваемых по Stackru), и я получаю эту страницу: http://groups.google.com/group/south-users/browse_thread/thread/d4c83f821dd2ca1c

Хорошо, так что я следую этим инструкциям

>> Drop database mydb;
>> Create database mydb;
$ rm -rf ./wall/migrations
$ py manage.py syncdb

Но когда я запускаю syncdb, Django создает несколько таблиц. Да, он создает таблицу south_migrationhistory, но также создает таблицы моего приложения.

Synced:
 > django.contrib.admin
 > django.contrib.auth
 > django.contrib.contenttypes
 > django.contrib.sessions
 > django.contrib.sites
 > django.contrib.messages
 > south
 > fable.notification
 > pagination
 > timezones
 > fable.wall
 > mediasync
 > staticfiles
 > debug_toolbar

Not synced (use migrations):
 - 
(use ./manage.py migrate to migrate these)

Круто.... теперь он говорит мне перенести это. Итак, я делаю это:

$ py manage.py  migrate wall
The app 'wall' does not appear to use migrations.

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

$ py manage.py schemamigration wall --initial

Затем я мигрирую:

$ py manage.py migrate wall

Знаешь что? Это дает мне этот BS:

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

Извините, это действительно меня бесит. Может кто-нибудь помочь? Благодарю.

Как заставить Юг работать и правильно синхронизироваться со всем? Единственное, о чем я могу думать, это удалить мое приложение из INSTALLED_APPS, затем запустить syncdb, а затем снова добавить его.

Это так глупо.

6 ответов

Решение

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

Ваша первая ошибка была в том, что когда вы удалили свои миграции, как только вы это сделали, а затем запустили syncdb, Django не знал, что вы хотите управлять этим приложением на юг, поэтому он создал таблицы для вас. Когда вы создали начальную миграцию, а затем запустили миграцию, south пытался создать таблицы, которые уже были созданы django, и, таким образом, вашу ошибку.

На данный момент у вас есть два варианта.

  1. Удалите таблицы для настенного приложения из базы данных, а затем запустите $ py manage.py migrate wall Это запустит миграцию и создаст ваши таблицы.

  2. Подделать начальный запуск миграции$ py manage.py migrate wall 0001 --fake Это скажет югу, что у вас уже есть таблицы в базе данных, поэтому просто подделайте ее, что добавит строку в таблицу south_migrationhistory, чтобы при следующем запуске миграции она знала, что первая миграция уже выполнена.

Настройка нового проекта и без базы данных

  1. создать свою базу данных
  2. добавить юг в установленные приложения
  3. запустите syncdb, это добавит таблицы django и south в базу данных
  4. добавить свои приложения
  5. для каждого запуска приложения python manage.py schemamigration app_name --initial это создаст начальные файлы миграции для вашего приложения
  6. затем бегите на юг, мигрируйте python manage.py migrate app_name это добавит таблицы в базу данных.

Настройка устаревшего проекта и базы данных

  1. добавить юг в установленные приложения
  2. запустите syncdb, это добавит южные таблицы в базу данных
  3. для каждого запуска ваших приложений python manage.py schemamigration app_name --initial Это создаст ваши начальные миграции
  4. для каждого запуска ваших приложений python manage.py migrate app_name 0001 --fake, это будет притворяться югом, оно не будет ничего делать с базой данных для этих моделей, оно просто добавит записи в таблицу south_migrationhistory, чтобы в следующий раз, когда вы захотите создать миграцию, все было готово.

Настройка устаревшего проекта и без базы данных

  1. создать базу данных
  2. добавить юг в установленные приложения
  3. для каждого запуска ваших приложений python manage.py schemamigration app_name --initial Это создаст ваши начальные миграции
  4. запустите syncdb, это добавит любые приложения, которые не имеют миграций в базу данных.
  5. затем бегите на юг, мигрируйте python manage.py migrate это запустит все миграции для ваших приложений.

Теперь, когда вы настроили юг, вы можете начать использовать юг для управления изменениями моделей в этих приложениях. Наиболее распространенная команда для запуска python manage.py schemamigration app_name migration_name --auto это будет смотреть на последнюю миграцию, которую вы запустили, и она найдет изменения и создаст файл миграции для вас. Тогда вам просто нужно бежать python manage.py migrate и это изменит вашу базу данных для вас.

Надеюсь, это поможет.

Вот так у меня все работает.

pip install South

# add 'south', to INSTALL_APPS, then
python manage.py syncdb

# For existing project + database
python manage.py convert_to_south app_name

# Thereafter, call them per model changes
python manage.py schemamigration app_name --auto
python manage.py migrate app_name

Рекомендации:

http://garmoncheg.blogspot.com/2011/08/django-how-and-why-to-use-migrations.html http://www.djangopro.com/2011/01/django-database-migration-tool-south-explained/

Учебник, который вы используете, утверждает:

(Если это не сработало, то вы не могли жаловаться на то, что south_migrationhistory не существует, вы забыли запустить syncdb после установки South.)

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

  1. Добавить юг к INSTALLED_APPS,
  2. Бежать syncdb,
  3. Затем следуйте инструкциям.

То есть ты уже должен был бежать syncdb прежде чем вы добавили в модели для вашего нового приложения. Ваше решение удалить ваше приложение из INSTALLED_APPS должен работать, но стоит отметить, что это действительно только "глупый" обходной путь, так как вы пропустили шаг ранее. Имел syncdb После запуска моделей до того, как вы создали модели для этого приложения, вам не придется использовать обходной путь.

Просто на будущее исх. Если Юг вызывает у вас проблемы:

  1. Удалите каталоги миграций из каталогов приложений
  2. Удалить Юг_migrations из вашей базы данных
  3. Запустите manage.py syncdb
  4. Вернитесь к использованию South (например, './manage.py convert_to_south что-то, ./manage.py migrate ...')

Это кажется очевидным, но я настоятельно рекомендую прочитать документы.

Даже после прочтения ответов на этот вопрос я изо всех сил пытался понять, как эффективно использовать Юг.

Все изменилось, конечно, в день, когда я прочитал документы, и вы тоже должны это сделать. Юг проще использовать, чем вы думаете.

http://south.aeracode.org/docs/about.html

http://south.aeracode.org/docs/tutorial/index.html

http://south.aeracode.org/docs/convertinganapp.html

Я также нашел это полезным:

http://www.djangopro.com/2011/01/django-database-migration-tool-south-explained/

И обязательно прочитайте статьи Джеффа Этвуда "Об ужасе кодирования", посвященные управлению версиями базы данных

Как заставить Юг работать и правильно синхронизироваться со всем? Единственное, о чем я могу думать, это удалить мое приложение из INSTALLED_APPS, затем запустить syncdb, а затем снова добавить его.

Я использовал это исправление с проблемами Юга в прошлом. Не красивое решение, но очень эффективное;)

Но главная проблема в том, что ваш заказ не правильный. Вы должны были запустить syncdb перед обучением. Чем это работает правильно.

Другие вопросы по тегам