问题:
有的时候我们对Django Models进行了某些修改会导致在新创建数据库时运行之前生成的 migration 文件报错
解决方案:
思路就是把原来的 migration 文件删除,重新生成,但要注意线上已有的环境中会记录已运行过的 migration,直接删除重新生成会导致原有环境 migrate
报错,这时候我们就要使用 squashmigrations
,具体步骤如下:
- 运行
squashmigrations
命令合并现有的 migration 文件:
./manage.py squashmigrations backup 0001_initial 0016_auto_20190904_2035
会生成一个 0001_initial_squashed_0016_auto_20190904_2035.py 文件
- 注意直接这样合并之后生成的新 migration 文件直接运行依然可能会报错的,这时要把原来的 migration 文件全部删除(注意做好备份以防万一),重新运行
./manage.py makemigrations backup
生成一个新的 0001_initial.py - 将 0001_initial_squashed_0016_auto_20190904_2035 里面的
operations = [...]
这段代码替换成新 0001_initial 中的 operations - 最后只保留新生成的 0001_initial_squashed_0016_auto_20190904_2035 文件就可以了,这个文件在新的环境中会运行,相当于运行了0001_initial,而在原有环境中会被略过,所以两边都不会报错
要注意的是被合并的migration文件要在原有环境中全部被运行过,通过数据库表中的 django_migrations 表可以查看到当前环境运行到了哪个 migration 文件