一、背景
前期手工调整了数据库表字段,导致django的makemigrations目录下的文件结构不一致,再次更新models.py时,执行报错:
django.db.utils.OperationalError: (1054, "Unknown column 'tag' in 'records_record'")
执行 python manage.py showmigrations records结果如下,0009没有执行。
records
[X] 0001_initial
[X] 0002_emailsettings_systemsettings_record_suspend_reason_and_more
[X] 0003_alter_record_tag_profile
[X] 0004_create_audit_role
[X] 0005_alter_record_tag_operationlog_auditlog
[X] 0006_task_alter_record_tag
[X] 0007_record_is_key_task
[X] 0008_record_work_hours
[ ] 0009_alter_record_tag
二、解决方法
(一)强制应用迁移(谨慎)
如果你确定 records.0009_alter_record_tag 已经实际修改了数据库结构,但 _django_migrations 表中没有记录这一点,你可以尝试使用 --fake 参数强制将该迁移标记为已应用。不过这种方法应当非常谨慎地使用,因为它不会真正改变数据库结构,只会在 _django_migrations 表中做标记。
命令:
python manage.py migrate records 0009 --fake
(.venv) PS C:\Users\itops> python manage.py migrate records 0009 --fake
Operations to perform:
Target specific migration: 0009_alter_record_tag, from records
Running migrations:
Applying records.0009_alter_record_tag... FAKED
(.venv) PS C:\Users\itops> python manage.py showmigrations records
records
[X] 0001_initial
[X] 0002_emailsettings_systemsettings_record_suspend_reason_and_more
[X] 0003_alter_record_tag_profile
[X] 0004_create_audit_role
[X] 0005_alter_record_tag_operationlog_auditlog
[X] 0006_task_alter_record_tag
[X] 0007_record_is_key_task
[X] 0008_record_work_hours
[X] 0009_alter_record_tag
然后继续应用后续的迁移:
pythion manage.py makemigrations
python manage.py migrate