Django の South で migrate したときに south.exceptions.GhostMigrations
migrate がなんかうまくいかない
コマンドは普通
python manage.py migrate --setting=settings...
例外がでた。同じ症状のが StackOverFlow にあったのではる
API Only - Stack Exchange
Traceback (most recent call last): File "manage.py", line 14, in <module> execute_manager(settings) File "/home/username/webapps/myproject/lib/python2.6/django/core/management/__init__.py", line 438, in execute_manager utility.execute() File "/home/username/webapps/myproject/lib/python2.6/django/core/management/__init__.py", line 379, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/username/webapps/myproject/lib/python2.6/django/core/management/base.py", line 191, in run_from_argv self.execute(*args, **options.__dict__) File "/home/username/webapps/myproject/lib/python2.6/django/core/management/base.py", line 220, in execute output = self.handle(*args, **options) File "/home/username/lib/python2.6/South-0.7.3-py2.6.egg/south/management/commands/migrate.py", line 105, in handle ignore_ghosts = ignore_ghosts, File "/home/username/lib/python2.6/South-0.7.3-py2.6.egg/south/migration/__init__.py", line 171, in migrate_app applied = check_migration_histories(applied, delete_ghosts, ignore_ghosts) File "/home/username/lib/python2.6/South-0.7.3-py2.6.egg/south/migration/__init__.py", line 88, in check_migration_histories raise exceptions.GhostMigrations(ghosts) south.exceptions.GhostMigrations: ! These migrations are in the database but not on disk: <bodyguard: 0002_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie> <bodyguard: 0003_auto__del_field_asset_is_reserved__add_field_asset_is_assigned> ! I'm not trusting myself; either fix this yourself by fiddling ! with the south_migrationhistory table, or pass --delete-ghost-migrations ! to South to have it delete ALL of these records (this may not be good).
これってなにかというと、要は MySQL とかに south_migrationhistory ってテーブルがあって、それを migration のたびにレコードを更新しているんだけどその database にはあって disk = migration file がないよって話。なんらかのかたちでこのエラーに遭遇したら、とりあえず警告にあるとおりに --delete-ghost-migrations してやれば解決する
python manage.py migrate --settings=settings... --delete-ghost-migrations
South はマジ便利、だけど銀の弾丸ではない
気をつけないといろいろハマりがち