Django 使用 squashmigrations 合并 migration 文件

问题:

有的时候我们对Django Models进行了某些修改会导致在新创建数据库时运行之前生成的 migration 文件报错

解决方案:

思路就是把原来的 migration 文件删除,重新生成,但要注意线上已有的环境中会记录已运行过的 migration,直接删除重新生成会导致原有环境 migrate 报错,这时候我们就要使用 squashmigrations,具体步骤如下:

  1. 运行 squashmigrations 命令合并现有的 migration 文件:
./manage.py squashmigrations backup 0001_initial 0016_auto_20190904_2035

会生成一个 0001_initial_squashed_0016_auto_20190904_2035.py 文件

  1. 注意直接这样合并之后生成的新 migration 文件直接运行依然可能会报错的,这时要把原来的 migration 文件全部删除(注意做好备份以防万一),重新运行 ./manage.py makemigrations backup 生成一个新的 0001_initial.py
  2. 将 0001_initial_squashed_0016_auto_20190904_2035 里面的 operations = [...] 这段代码替换成新 0001_initial 中的 operations
  3. 最后只保留新生成的 0001_initial_squashed_0016_auto_20190904_2035 文件就可以了,这个文件在新的环境中会运行,相当于运行了0001_initial,而在原有环境中会被略过,所以两边都不会报错

要注意的是被合并的migration文件要在原有环境中全部被运行过,通过数据库表中的 django_migrations 表可以查看到当前环境运行到了哪个 migration 文件

你可能感兴趣的:(Django,migrate,Python,Django)