South не будет генерировать или применять миграции для существующего приложения с изменениями для миграции - PullRequest
8 голосов
/ 04 сентября 2011

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

[graffias:~/testing.tustincommercial.com/oneclickcos]$ python ./manage.py schemamigration mainapp --auto
You cannot use --auto on an app with no migrations. Try --initial.
[graffias:~/testing.tustincommercial.com/oneclickcos]$ python ./manage.py schemamigration mainapp --initial
 + Added model mainapp.CompanyUK
 + Added model mainapp.CompanyName
 + Added model mainapp.Individual
 + Added model mainapp.Director
 + Added model mainapp.DirectorsIndividual
 + Added model mainapp.DirectorsCorporate
 + Added model mainapp.ShareCapitalClass
 + Added model mainapp.Member
 + Added model mainapp.MembersIndividual
 + Added model mainapp.MemberGeneric
 + Added model mainapp.CompanyManager
 + Added model mainapp.PendingRegistration
 + Added model mainapp.PendingAuthorisation
Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate mainapp
[graffias:~/testing.tustincommercial.com/oneclickcos]$ python ./manage.py migrate mainapp
Running migrations for mainapp:
- Nothing to migrate.
 - Loading initial data for mainapp.
No fixtures found.
[graffias:~/testing.tustincommercial.com/oneclickcos]$ 

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

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

Ответы [ 4 ]

9 голосов
/ 04 сентября 2011

Полагаю, вы попали в беду, не начав с ./manage.py convert_to_south mainapp. Может быть, вы можете исправить это, выполнив:

(1) Заставьте Юг поверить, что вы не выполнили первую миграцию, поэтому идите к нулю

./manage.py migrate --fake mainapp zero

(2) Миграция по-настоящему на первую миграцию.

./manage.py migrate mainapp

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

Вы можете изменить эту ситуацию:

(1) Удаление первой схемы миграции путем удаления mainapp / migrations / 0001_initial.py. Вам не нужно напрямую возиться с таблицей базы данных South, --delete-ghost-migrations позаботится об этом.

(2) ./manage.py syncdb Юг ожидает, что база данных будет синхронизирована с моделями.

(3) ./manage.py convert_to_south mainapp, чтобы фактически позволить South обрабатывать базу данных и миграцию.

(4) ./manage.py migrate --delete-ghost-migrations mainapp для перехода к первой миграции и удаления старой первой миграции, удаленной из миграций / из базы данных

2 голосов
/ 10 февраля 2013

Также обратите внимание, что, если вы используете кэш QuerySet, например Johnny Cache, удаление истории миграции из базы данных не поможет, вам нужно либо уничтожить memcached: killall memcached, либо для проектов, находящихся в производстве, вам нужно аннулировать таблицу south_migrationhistory, используя следующиеиспользуя python manage.py shell:

from johnny.cache import invalidate
invalidate('south_migrationhistory')

Это было так для меня.

2 голосов
/ 04 сентября 2011

Из отдела грязных хаков:

Этот процесс решил мою проблему, но вряд ли он изящен.

(1) Удалить все миграции в уязвимом приложении (rm mainapp/migrations/*)

(2) Удалите файл models.py и замените его пустым файлом (mv mainapp/models.py .; rm mainapp/*.pyc; touch mainapp/models.py)

(3) Создать начальную миграцию, которая ничего не делает (python ./manage.py schemamigration mainapp --initial), и применить ее (python ./manage.py migrate mainapp)

(4) Восстановите модели и создайте миграцию, которая воссоздает все (rm mainapp/models.py; mv models.py mainapp/; python ./manage.py schemamigration mainapp --auto)

(5) ДО запуска новой миграции отредактируйте ее, чтобы закомментировать все изменения, которые не являются действительно новыми изменениями. В качестве альтернативы, запустите его, и он даст сбой в существующих таблицах, а затем закомментируйте все.

(6) Примените миграцию, чтобы перевести юг в нормальное состояние (и внесите изменения, если вы выполнили мой рекомендуемый курс на шаге (5): python ./manage.py migrate mainapp)

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

1 голос
/ 16 декабря 2013

Если вы уже создали базу данных, вам нужно использовать:

python manage.py convert_to_south myapp

вместо schemamigration.Если для этого уже слишком поздно и вам не нужны данные в вашей базе данных, выполните:

  1. очистите базу данных с помощью: python manage.py flush
  2. удалите старые миграции с помощью: sudo rm /path/to/myapp/migrations/*.*
  3. python manage.py syncdb
  4. sudo python manage.py convert_to_south myapp
...