在 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 没有 ''
.
我正在向我的一个模型添加一个非空 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 没有 ''
.