在 Django 1.7.8 中添加 blank=True CharField 时迁移无效 SQL

Invalid migration SQL when adding blank=True CharField in Django 1.7.8

我正在向我的一个模型添加一个非空 CharField

channel_class = models.CharField(max_length=10, blank=True)

我创建迁移:

django-admin.py makemigrations webapp

它不问我关于默认值的任何问题(请参阅 this ticket 关于提示 blank=True 的默认值)。

为此迁移生成的 SQL 是:

$ django-admin.py sqlmigrate webapp 0003_auto_20150514_1112
BEGIN;
ALTER TABLE `webapp_lead` ADD COLUMN `channel_class` varchar(10) DEFAULT  NOT NULL;                                                                                                                                                                                            
ALTER TABLE `webapp_lead` ALTER COLUMN `channel_class` DROP DEFAULT; 
COMMIT;

但是,如果我将其插入 MySQL 编辑器那一行,我会得到一个错误:

mysql> ALTER TABLE `webapp_lead` ADD COLUMN `channel_class` varchar(10) DEFAULT  NOT NULL;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOT NULL' at line 1

如果我使用它就有效:

mysql> ALTER TABLE `webapp_lead` ADD COLUMN `channel_class` varchar(10) DEFAULT '' NOT NULL;

即如果我指定一个空字符串作为默认值。

我的猜测是 this bug 的修复引入了一个新错误?

https://code.djangoproject.com/ticket/24803

这是 django 中的一个错误。 在 django.db.backends.base.schema.BaseDatabaseSchemaEditor#execute 中,当收集的 SQL 存储在 self.collected_sql 中时,空字符串以错误的方式传递给格式化字符串,因此结果 SQL 没有 ''.