mysql - Django AutoField 默认值错误

标签 mysql django python-2.7 database-migration

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/

相关文章:

mysql - 如何根据一列对查询结果进行排序?

php - 从两个表内连接中删除*

python - 新的聊天消息通知 Django Channels

python-2.7 - 在进程之间共享字典

python - OSX 安装 Python 分发

php - 使用 `fetchAll("创建的数组的回显值从 `name` 中选择 `classes`")`

javascript - node-mysql:使用 object.query 时出错

django - "decoder jpeg not available"与 Elastic beanstalk 上的 Django

mysql - SQL 是否有类似 Django 的 "get_FOO_display()"?

python - 如何根据 Kivy 中另一个小部件的值禁用一个小部件