﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
23609	Migration fails on SQLite when removing a NULL constraint	Markus Holtermann	Markus Holtermann	"If a model has e.g `IntegerField(null=True)` and a migration changes it to `IntegerField(default=42)` the migration fails on SQLite due to the way the new table is created (create new table and copy old data into it). The respective SQL code Django produces is:

{{{#!sql
CREATE TABLE ""testapp_foo__new"" (""id"" integer NOT NULL PRIMARY KEY AUTOINCREMENT, ""d"" integer NOT NULL);
INSERT INTO ""testapp_foo__new"" (""id"", ""d"") SELECT ""id"", ""d"" FROM ""testapp_foo"";
}}}

The first idea for a patch was to do a two-step insert, first all rows w/o NULL values and second those w/ NULL and adding a the default explicitly. This would involve some more code changes. apollo13 came up with the idea to use a `CASE WHEN` SQL syntax which, as it turns out, seems quite nice:

{{{#!sql
CREATE TABLE ""testapp_foo__new"" (""id"" integer NOT NULL PRIMARY KEY AUTOINCREMENT, ""d"" integer NOT NULL);
INSERT INTO ""testapp_foo__new"" (""id"", ""d"") SELECT ""id"", CASE WHEN ""d"" IS NULL THEN 42 ELSE ""d"" END FROM ""testapp_foo"";
}}}"	Uncategorized	new	Database layer (models, ORM)	1.7	Normal			Markus Holtermann	Unreviewed	0	0	0	0	0	0
