Почему мои южные миграции не работают?
во-первых, я создаю свою базу данных.
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 ответов:
South позволяет создавать миграции при первом запуске с новым приложением, и таблицы еще не были добавлены в базу данных, а также создавать миграции для устаревших приложений, которые уже имеют таблицы в базе данных. Главное-знать, когда и что делать.
ваша первая ошибка была, когда вы удалили свои миграции, как только вы это сделали, а затем запустили syncdb, Django не знал, что вы хотите, чтобы Юг больше управлял этим приложением, поэтому он создал таблицы для вас. Когда вы создали свои первоначальные миграции, а затем запустили миграцию, south пытался создать таблицы, которые уже создал django, и, следовательно, ваша ошибка.
на данный момент у вас есть два варианта.
удалите таблицы для приложения wall из своей базы данных, а затем запустите
$ py manage.py migrate wall
это запустит миграцию и создаст ваши таблицы.подделать начальный запуск миграции
$ py manage.py migrate wall 0001 --fake
раскажи это юг, что у вас уже есть таблицы в базе данных так просто подделать его, который добавит строку в таблицу south_migrationhistory, так что в следующий раз при запуске миграции он будет знать, что первая миграция уже была запущена.создание нового проекта и базы данных
- создайте свою базу данных
- добавить Юг в установленные приложения
- запустите syncdb, это добавит таблицы django и south в базу данных
- добавить приложения
- для каждого запуска приложения
python manage.py schemamigration app_name --initial
это создаст исходные файлы миграции для вашего приложения- тогда беги на юг мигрируй
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, это добавит любые приложения, которые не имеют миграции в базу данных.
- тогда беги на юг мигрируй
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 после установленный Юг.)
предполагая, что ваш пост точно детализирует шаги, которые Вы предприняли, следуя этой ссылке, кажется, показывает, что вы пропустили шаг перед настройкой нового приложения. Поскольку вы следуете учебнику по настройке миграции в новом приложении, порядок это:
- добавить Южный до
INSTALLED_APPS
.- выполнить
syncdb
.- затем следуйте инструкциям.
то есть, вы должны были уже запустить
syncdb
перед добавлением в модели для нового приложения. Ваше решение удаления вашего приложения сINSTALLED_APPS
должно работать, но стоит отметить, что на самом деле это всего лишь "глупая" работа, так как вы пропустили шаг раньше. Имелsyncdb
запускался до создания моделей для этого приложения, вам не придется использовать обходной путь.
только для будущего ref. Если Юг дает вам какие-либо проблемы:
- удалить миграция каталоги из ваших каталогов приложений
- удалить Южный _migrations из вашей базы данных
- Run manage.py syncdb
- вернитесь к использованию 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 перед учебником. Чем он работает правильно.