Last week at work I stumbled upon this problem: two of the Django-south migrations made conflicting changes to the database schema. Let’s say 0003_migration_1 & 0003_migration_2 are the two migrations applied in the same order. But, the models in migration_2 do not include the changes made by migration_1.
This causes a problem while creating a new migration
$ python manage.py schemamigration my_app –auto [–stdout]
creates a new migration: 0004_migration_1. While creating this new migration, Django-south does a diff(1) between the current models definition and the one in the last applied migration ie: 0003_migration_2. But since 0003_migration_2 did not include the model changes from 0003_migration_1, the new migration: 0004_migration_1 includes those changes. And when you try to apply this new migration
$ python manage.py migrate my_app
it causes an error wherein Django-south says that some of the database changes already exist in the database.
Now one solution, though not so straightforward, is to manually merge the two migrations: 0003_migration_1 and 0003_migration_2, so that the resulting new migration script combines the two model definitions.
Thankfully, Django-south has a way to create empty migrations and freeze the models definition. Empty migrations don’t make any schema chagnes, but only store the updated model definitions.
$ python manage.py schemamigration –freeze=my_app –empty –auto [–stdout]
creates a new migration 0004_empty_migration_1, which holds the latest model definitinons, ie changes made by 0003_migration_1 and 0003_migration_2 together into one. After applying the empty migration, I could create the new migration: 0005_migration_1 to include just the new schama changes and exclude the ones which were already applied by previous migrations.
* Tip: use –stdout option to see and verify the schema changes included in the new migration.