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?
最佳答案
您可以修复 SQL 中的错误(如果您还没有修复的话),然后运行 ./manage.py migrate [your_app_name] [the_migration_number] --fake
--fake
会告诉 Django 假装它运行了迁移并且它不会尝试再次运行它。
只需确保您在 SQL 中所做的更改准确反射(reflect)在假迁移中,因为 Django 在您运行 makemigrations
时不会将模型与数据库进行比较。
关于id列的错误,如果我没记错的话,mysql自增字段是不能赋默认值的。
关于mysql - Django AutoField 默认值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27548979/