Opened 4 years ago

Closed 4 years ago

Last modified 4 years ago

#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 murfi)

Steps to reproduce:

  1. Create a simple model:
    class TestModel(models.Model):
            value_a = models.IntegerField(null=False)
    
  2. ./manage.py makemigrations
  3. ./manage.py migrate
  4. 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)
    
  5. Change model field name value_a -> value_b:
    class TestModel(models.model):
            value_b = models.IntegerField(null=False)
    
  6. ./manage.py makemigrations
  7. ./manage.py migrate
  8. 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)

ticket_24817.patch (2.3 KB) - added by Andriy Sokolovskiy 4 years ago.
Test to reproduce the issue

Download all attachments as: .zip

Change History (16)

comment:1 Changed 4 years ago by murfi

Description: modified (diff)

comment:2 Changed 4 years ago by Alasdair Nicol

Resolution: duplicate
Status: newclosed

This looks like a duplicate of #24595, which is fixed in 1.7.8 and 1.8.1.

comment:3 Changed 4 years ago by Alasdair Nicol

Cc: alasdair@… added

comment:4 Changed 4 years ago by murfi

Description: modified (diff)
Resolution: duplicate
Status: closednew

comment:5 Changed 4 years ago by murfi

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 4 years ago by Alasdair Nicol

Severity: NormalRelease blocker
Triage Stage: UnreviewedAccepted

Apologies for incorrectly closing as a duplicate before. I can reproduce in Django 1.7.8, 1.8.1 and master.

comment:7 Changed 4 years ago by Claude Paroz

We've missed the rename use case while fixing #24595 :-(

Changed 4 years ago by Andriy Sokolovskiy

Attachment: ticket_24817.patch added

Test to reproduce the issue

comment:8 Changed 4 years ago by Andriy Sokolovskiy

Cc: me@… added

I just attached a patch with tests which reproduces the issue.
I'm also working on fixing issue

comment:9 Changed 4 years ago by Andriy Sokolovskiy

Has patch: set
Owner: changed from nobody to Andriy Sokolovskiy
Status: newassigned

comment:10 Changed 4 years ago by Andriy Sokolovskiy

comment:11 Changed 4 years ago by Tim Graham

Triage Stage: AcceptedReady for checkin

Claude, look good to you?

comment:12 Changed 4 years ago by Claude Paroz

Yes, sure! Thanks Andriy.

comment:13 Changed 4 years ago by Tim Graham <timograham@…>

Resolution: fixed
Status: assignedclosed

In 80ad547:

Fixed #24817 -- Prevented loss of null info in MySQL field renaming.

comment:14 Changed 4 years ago by Tim Graham <timograham@…>

In f65d4db:

[1.8.x] Fixed #24817 -- Prevented loss of null info in MySQL field renaming.

Backport of 80ad5472ce4b6ba6e94227422d0727371e97cdf0 from master

comment:15 Changed 4 years ago by Tim Graham <timograham@…>

In 927d90ee:

[1.7.x] Fixed #24817 -- Prevented loss of null info in MySQL field renaming.

Backport of 80ad5472ce4b6ba6e94227422d0727371e97cdf0 from master

Note: See TracTickets for help on using tickets.
Back to Top