【发布时间】:2015-02-17 09:10:01
【问题描述】:
Django 1.7.1、MySQL 5.6、Python 2.7.8
我有一个看起来像这样的模型:
class Host(models.Model):
hostName = models.CharField(max_length=45, primary_key=True)
...
我手动删除了primary_key=True,这导致manage.py sqlmigrate 显示主键正在被删除,正在添加一个自动递增的'id' 列,并且它正在获取主键。我被提示输入新的'id' 列的默认值,并错误地给它1,它已经在表中。相关的 SQL 读取:
ALTER TABLE `Host` ADD COLUMN `id` integer AUTO_INCREMENT DEFAULT 1 NOT NULL PRIMARY KEY;
以及包含的迁移代码:
operations = [
migrations.AddField(
model_name='host',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, default=1, serialize=False, verbose_name='ID'),
preserve_default=False,
),
结果是我仍然可以修改我的模型并且makemigrations 可以工作,但是每个migrate 命令都会给出这个错误:
django.db.utils.OperationalError: (1067, "Invalid default value for 'id'")
并且不生效。
我已尝试还原主键更改,手动将紧随其后的迁移指向上一个迁移(这会引发一致性问题),并显式迁移到紧邻的上一个迁移。 我真正想做的只是删除/忽略问题迁移。我也很满意抑制错误,因为我已经恢复了更改。我该怎么做?
编辑:
另外,如果自动增量列永远不能有默认值,为什么 Django 允许自己使用...AUTO_INCREMENT DEFAULT 1... 传递 SQL?
【问题讨论】:
标签: mysql django python-2.7 database-migration