Django执行migrate后sqlite3未生成表、字段缺失OperationalError报错求助
Django迁移失败表字段缺失解决方案
问题根因
- 你的迁移链在执行
meetups.0005_auto_20211026_1234时就因默认值格式错误崩溃,后续生成的包含删除enormus字段、新增dates/organizer_emails字段的迁移根本没有执行,导致数据库表结构、Django迁移记录、models.py三者状态不一致,才会出现admin操作时报表没有enormus字段的错误。 - 之前执行迁移时输入的非字符串格式默认值(比如数字1)和日期字段类型不匹配,是迁移执行报错的直接原因。
- ManyToManyField配置
null=True属于无效配置,会触发警告。
修复步骤
第一步:清理无效迁移记录
- 查看meetups应用的迁移执行状态,找到最后一个成功执行的迁移(正常为0004版本):
python manage.py showmigrations meetups - 把meetups应用的迁移状态伪回退到最后一个正常版本,仅修改Django的迁移记录,不改动数据库结构:
python manage.py migrate --fake meetups 0004 - 手动删除
meetups/migrations目录下所有编号大于0004的迁移文件(即0005到0011的所有py文件,注意不要删__init__.py)。
- 查看meetups应用的迁移执行状态,找到最后一个成功执行的迁移(正常为0004版本):
第二步:修正models.py配置
- 删掉
participant字段(ManyToManyField类型)的null=True参数,该参数对多对多字段无意义。 - 给所有新增的非空字段直接配置
default参数,避免后续生成迁移时手动输入默认值出错:- 日期字段示例:
dates = models.DateField(default="2021-10-10"),或者导入django.utils.timezone后设default=timezone.now - 邮箱字段示例:
organizer_emails = models.EmailField(default="test@test.com") - 如果允许字段为空,直接配置
null=True, blank=True即可,不需要设默认值。
- 日期字段示例:
- 删掉
第三步:重新执行迁移
- 重新生成迁移文件:
python manage.py makemigrations meetups - 执行迁移,此时不会再报错:
python manage.py migrate
- 重新生成迁移文件:
内容的提问来源于stack exchange,提问作者Саша Саша
相关产品推荐
相关产品推荐

