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

时间:2015-05-14 14:07:42

标签: mysql django django-migrations

我在其中一个模型中添加了一个非空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的修复程序引入了一个新错误?

1 个答案:

答案 0 :(得分:2)

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

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