Почему мои южные миграции не работают? - PullRequest
79 голосов
/ 30 января 2011

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

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, а затем снова добавить его.

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

Ответы [ 6 ]

175 голосов
/ 30 января 2011

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

Ваша первая ошибка была, когда вы удалили свои миграции, как только вы это сделали, а затем запустили 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 это создаст начальные файлы миграции дляr Ваше приложение
  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. для каждого из ваших приложенийrun 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, и он изменит вашу базу данных.

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

10 голосов
/ 03 января 2012

Вот так у меня все получается.

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/

8 голосов
/ 30 января 2011

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

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

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

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

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

3 голосов
/ 25 октября 2013

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

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

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

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

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

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/

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

0 голосов
/ 30 января 2011

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

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

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

...