Opened 9 years ago
Closed 9 years ago
#25752 closed Bug (duplicate)
RenameField on m2m causes error when new m2m field is added with old name
Reported by: | skyjur | Owned by: | nobody |
---|---|---|---|
Component: | Migrations | Version: | 1.7 |
Severity: | Normal | Keywords: | postgres migrations renamefield |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Given I have a field
many = ManyToManyField()
I create a migration:
RenameField: "many" to "many_legacy" Create Field: "many" as ManyToManyField()
When I run the migration I get:
... File "django/db/backends/utils.py", line 64, in execute return self.cursor.execute(sql, params) File "django/db/utils.py", line 97, in __exit__ six.reraise(dj_exc_type, dj_exc_value, traceback) File "django/db/backends/utils.py", line 64, in execute return self.cursor.execute(sql, params) django.db.utils.ProgrammingError: relation "cms_test_many_2e06cda4" already exists
It seems the problem is that RenameField does not rename database indexes, and then when new m2m field is being added it tries to create index with same name and so I get database error.
Here is full migration code which throws this error:
class Migration(migrations.Migration): dependencies = [ ] operations = [ migrations.RenameField( 'test', 'many', 'many_legacy', ), migrations.AddField( model_name='test', name='many', field=models.ManyToManyField(to='cms.NewRel2'), ), ]
Initially I noticed this error on 1.7, then I also managed to replicate it on 1.8
Error happened on postgres database.
Change History (7)
comment:1 by , 9 years ago
comment:2 by , 9 years ago
Type: | Uncategorized → Bug |
---|
comment:3 by , 9 years ago
Description: | modified (diff) |
---|
comment:4 by , 9 years ago
comment:5 by , 9 years ago
Version: | 1.8 → 1.7 |
---|
comment:7 by , 9 years ago
Resolution: | → duplicate |
---|---|
Status: | new → closed |
Note:
See TracTickets
for help on using tickets.
The workaround I used was to rename those sql indexes with additional RunSQL: