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

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

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 вопросов заданы в Stackoverflow), и я получаю эту страницу: 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, а затем добавить его обратно.

Это SO SILLY.

Ответ 1

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

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

На этом этапе у вас есть два варианта.

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

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

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

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

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

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

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

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

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

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

Ответ 2

Вот как я работаю.

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/

Ответ 3

Учебное пособие, в котором вы используете состояния:

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

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

  • Добавьте юг к INSTALLED_APPS.
  • Выполнить syncdb.
  • Затем следуйте инструкциям.

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

Ответ 4

Только для будущего ref. Если Юг дает вам какие-либо проблемы:

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

Ответ 5

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

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

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

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

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

http://south.aeracode.org/docs/convertinganapp.html#converting-an-app

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

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

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

Ответ 6

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

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

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