gpt4 book ai didi

mysql - Django AutoField 默认值错误

转载 作者:可可西里 更新时间:2023-11-01 07:05:14 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com