#24817 closed Bug (fixed)
Renaming a model field that has null=False makes it nullable in MySQL
Reported by: | murfi | Owned by: | Andriy Sokolovskiy |
---|---|---|---|
Component: | Migrations | Version: | 1.8 |
Severity: | Release blocker | Keywords: | |
Cc: | alasdair@…, me@… | Triage Stage: | Ready for checkin |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Steps to reproduce:
- Create a simple model:
class TestModel(models.Model): value_a = models.IntegerField(null=False)
- ./manage.py makemigrations
- ./manage.py migrate
- So far so good:
mysql> describe testy_testmodel; +---------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | value_a | int(11) | NO | | NULL | | +---------+---------+------+-----+---------+----------------+ 2 rows in set (0.00 sec)
- Change model field name value_a -> value_b:
class TestModel(models.model): value_b = models.IntegerField(null=False)
- ./manage.py makemigrations
- ./manage.py migrate
- NOT NULL for value_b has been lost:
mysql> describe testy_testmodel; +---------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | value_b | int(11) | YES | | NULL | | +---------+---------+------+-----+---------+----------------+ 2 rows in set (0.00 sec)
The ALTER-statement django produces is
ALTER TABLE `testy_testmodel` CHANGE `value_a` `value_b` integer;
...and it should contain the NOT NULL, but it doesn't.
Edit: Similar bug when changing field type was fixed in #24595. The bug is still present in 1.8.1 when renaming a field.
Attachments (1)
Change History (16)
comment:1 Changed 9 years ago by
Description: | modified (diff) |
---|
comment:2 Changed 9 years ago by
Resolution: | → duplicate |
---|---|
Status: | new → closed |
comment:3 Changed 9 years ago by
Cc: | alasdair@… added |
---|
comment:4 Changed 9 years ago by
Description: | modified (diff) |
---|---|
Resolution: | duplicate |
Status: | closed → new |
comment:5 Changed 9 years ago by
True the comment in the end related to changing field type was invalid and fixed in #24595. The example case is still reproducible with Django==1.8.1.
comment:6 Changed 9 years ago by
Severity: | Normal → Release blocker |
---|---|
Triage Stage: | Unreviewed → Accepted |
Apologies for incorrectly closing as a duplicate before. I can reproduce in Django 1.7.8, 1.8.1 and master.
comment:8 Changed 9 years ago by
Cc: | me@… added |
---|
I just attached a patch with tests which reproduces the issue.
I'm also working on fixing issue
comment:9 Changed 9 years ago by
Has patch: | set |
---|---|
Owner: | changed from nobody to Andriy Sokolovskiy |
Status: | new → assigned |
comment:11 Changed 9 years ago by
Triage Stage: | Accepted → Ready for checkin |
---|
Claude, look good to you?
This looks like a duplicate of #24595, which is fixed in 1.7.8 and 1.8.1.