WAF*_*WAF 5 mysql django database-migration python-2.7
Django 1.7.1,MySQL 5.6,Python 2.7.8
我有一个看起来像这样的模型:
class Host(models.Model):
hostName = models.CharField(max_length=45, primary_key=True)
...
Run Code Online (Sandbox Code Playgroud)
我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;
Run Code Online (Sandbox Code Playgroud)
和迁移代码包括:
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,
),
Run Code Online (Sandbox Code Playgroud)
结果是我仍然可以修改我的模型和makemigrations
工作,但每个migrate
命令都会出现此错误:
django.db.utils.OperationalError: (1067, "Invalid default value for 'id'")
Run Code Online (Sandbox Code Playgroud)
并且不生效.
我已经尝试恢复主键更改,在上一次迁移时手动指向紧接的后续迁移(这会引发一致性问题),并明确迁移到上一次迁移.我真正想做的只是擦除/忽略问题迁移.我也很满意抑制错误,因为我已经恢复了改变.我该怎么办?
编辑:
另外,如果自动增量列永远不能有默认值,为什么Django允许自己传递SQL ...AUTO_INCREMENT DEFAULT 1...
?
小智 6
您可以修复SQL中的错误(如果您还没有),然后运行 ./manage.py migrate [your_app_name] [the_migration_number] --fake
这--fake
将告诉Django假装它运行迁移,它不会再尝试运行它.
请确保您在SQL中所做的更改准确地反映在虚假迁移中,因为Django在您运行时不会将模型与数据库进行比较makemigrations
.
关于id列的错误,如果我没记错的话,你不能为mysql自动增量字段分配一个默认值.