1 | | This one's a bit of an edge case, but I ran into it trying to refactor some models on my moderately large work project. |
2 | | |
3 | | Let's say I have a Django 1.7 app called `sample`: |
4 | | 1. Create a model `Bar`. |
5 | | 2. Create a model `Foo` with `bar = models.ForeignKey(Bar, blank=True, null=True)` |
6 | | 3. `makemigrations` (migration `0001`) |
7 | | 4. Rename `Foo` to `OldFoo`. |
8 | | 5. `makemigrations`, say yes to the rename prompt (migration `0002`) |
9 | | 6. Create new model `Foo`, which also has `bar = models.ForeignKey(Bar, blank=True, null=True)` |
10 | | 7. `makemigrations` (migration `0003`) |
11 | | 8. `migrate` |
12 | | |
13 | | When `migrate` hits `0003`, it throws this error: |
14 | | {{{django.db.utils.OperationalError: index sample_foo_4350f7d0 already exists}}} |
15 | | |
16 | | You may notice that `sqlmigrate sample 0001` and `sqlmigrate sample 0003` have the same line in both of them: |
17 | | {{{CREATE INDEX sample_foo_4350f7d0 ON "sample_foo" ("bar_id");}}} |
18 | | |
19 | | |
20 | | In my production case, I actually had no problems on servers, because South had created the index with a different name. When I renamed the models and added a field, the new index did not collide with the old one. However, our test suite started failing, because it would run the migrations from the ground up, exposing the above bug. |
21 | | |
22 | | I haven't decided on a workaround yet, but I thought I'd bring this to your attention. I might have to inject a migration that renames the index created in `0001`, or something to that effect. |
23 | | |
24 | | The attached test case has a project `dj17test` in the state after having performed all of the above steps. |