Opened 10 years ago
Closed 10 years ago
#23678 closed Bug (worksforme)
Database default not removed if default=None
Reported by: | Tim Graham | Owned by: | nobody |
---|---|---|---|
Component: | Migrations | Version: | 1.7 |
Severity: | Release blocker | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
If you have a model field like models.CharField(max_length=255, blank=True, null=True, default=None)
, you will end up something like varchar(255) DEFAULT NULL
with MySQL. The DEFAULT NULL
should be dropped but isn't due to the field.default is not None
check here: https://github.com/django/django/blob/8d6e1afe0be0570253a508f43e2ef89ae640984e/django/db/backends/schema.py#L382
Change History (3)
comment:1 by , 10 years ago
follow-up: 3 comment:2 by , 10 years ago
@paulcdejean how do you get those results? I just tried with the sqlmigrate
command on initial migration on MySQL and my models.CharField(max_length=42, null=True)
doesn't show a DEFAULT.
comment:3 by , 10 years ago
Resolution: | → worksforme |
---|---|
Status: | new → closed |
Replying to loic:
@paulcdejean how do you get those results? I just tried with the
sqlmigrate
command on initial migration on MySQL and mymodels.CharField(max_length=42, null=True)
doesn't show a DEFAULT.
You can see the difference as described if you actually run the migration and then check show create table tablename
in MySQL.
However, I am not convinced that this reflects a bug in Django, as opposed to just a slightly odd behavior of show create table
in MySQL. (I am not very familiar with MySQL, so I could well be missing something).
For one thing, this difference doesn't show up in describe tablename
: all nullable fields with no other default show NULL
in the "default" column, regardless of whether they show DEFAULT NULL
in the show create table tablename
output or not.
Secondly, if I add a column directly in MySQL (no involvement from Django) using this exact syntax: ALTER TABLE 'testapp_thing' ADD COLUMN 'direct' varchar(100);
(note that I did not specify DEFAULT NULL
, or any other default), this is what show create table testapp_thing
gives for that column: 'direct' varchar(100) DEFAULT NULL,
. In other words, MySQL seems to be adding that DEFAULT NULL
itself, even if it wasn't in the ALTER TABLE
.
And lastly, I am not convinced that any of this matters anyway. The nullable columns that do and don't show DEFAULT NULL
in the show create table tablename
output seem to behave identically - they all in practice still use NULL
as their default value (consistent with the fact that they all show NULL
in the "default" column of their describe
output).
My conclusion: NULL
is the "default default" for any nullable column without another explicit default value. There is no issue in Django here, just some strange (but harmless) behavior from MySQL.
Closing; please reopen if you can provide further evidence that this is a problem in Django.
Not exactly accurate: