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


во-первых, я создаю свою базу данных.

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 78

6 ответов:

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

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

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

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

теперь, когда вы настроены с south, вы можете начать использовать south для управления изменениями модели в этих приложениях. Наиболее распространенной командой для запуска является 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 после установленный Юг.)

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

  1. добавить Южный до INSTALLED_APPS.
  2. выполнить syncdb.
  3. затем следуйте инструкциям.

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

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

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

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

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

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

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/

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

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

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

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