Django-合并migrations

一、背景

在开发一个迭代时,产生了很多migrations文件,而且这些migrations文件都是一个model表改来改去产生的,有必要将这个迭代的migrations文件在提测前合并成一个migrations文件。

二、操作方法

方法一:需要对已经初始化的库表做还原删除

  1. 直接将本次迭代所产生的migrations文件删除
  2. 执行命令 python manage.py makemigrations生成一个新的migrations文件
  3. 去数据库中,找到 django_migrations表,删除步骤2对应的记录
  4. 在数据库中,找到步骤2migrations文件所创建的表和字段,然后删掉
  5. 最后执行命令 python manage.py migrate重新初始化数据库

方法二:不删除数据库,只是重新创建新的migrations文件

  1. 首先要保证,目前的migration文件和数据库是同步的,通过执行。
    python manage.py makemigrations
  2. 查看当前项目下所有APP对应的已经生效的(已经成功执行的)migration文件,
    命令如下:
    python manage.py showmigrations
    结果如下:
account
 [X] 0001_initial
 [X] 0002_initial_user_data
 [X] 0003_auto_20180806_1432
admin
 [X] 0001_initial
app_control
 [X] 0001_initial
 [X] 0002_initial_app_control
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
djcelery
 [X] 0001_initial
home_application
 [X] 0001_initial
 [X] 0002_auto_20191204_2347
 [X] 0003_auto_20191205_1135
 [X] 0004_auto_20191219_1745
 [X] 0005_auto_20191223_1541
 [X] 0006_auto_20200221_0006
 [X] 0007_auto_20200320_1448
 [X] 0008_auto_20200407_1422
 [X] 0009_initial_team
 [X] 0010_auto_20200422_1646
 [X] 0011_excel
 [X] 0012_checkobj_search_field
 [X] 0013_auto_20210301_1600
 [X] 0014_scriptitem_influence_level
 [X] 0015_customfield
 [X] 0016_auto_20210302_1505
 [X] 0017_auto_20210302_1507
 [X] 0018_paramset_snapshot
 [X] 0019_auto_20210304_1116
 [X] 0020_auto_20210304_1148
 [X] 0021_reportitem_influence_level
 [X] 0013_auto_20210304_2035
 [X] 0022_merge
 [X] 0023_htmlfile
 [X] 0024_auto_20210427_1343
 [X] 0025_scriptitem_description
 [X] 0026_scriptitem_suggestions
 [X] 0027_auto_20210521_1552
 [X] 0028_auto_20210524_1546
 [X] 0029_reports_report_name
 [X] 0030_auto_20210729_1354
 [X] 0031_auto_20210729_1413
 [X] 0032_auto_20220221_1520
 [X] 0033_menurole
 [X] 0034_auto_20220302_2118
 [X] 0035_auto_20220303_1908
 [X] 0036_tasktimeset_unit
 [X] 0037_auto_20220321_1918
 [X] 0038_auto_20220321_2010
 [X] 0039_auto_20220322_0931
sessions
 [X] 0001_initial
sites
 [X] 0001_initial
  1. 重置你的APP的操作,使它们恢复到没有执行的状态,这里注意一下fake前面的符号,是两个”-“,另外,app_name 是APP的名字。
    python manage.py migrate --fake app_name zero
    重装完后进行检查: python manage.py showmigrations
account
 [X] 0001_initial
 [X] 0002_initial_user_data
 [X] 0003_auto_20180806_1432
admin
 [X] 0001_initial
app_control
 [X] 0001_initial
 [X] 0002_initial_app_control
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
djcelery
 [X] 0001_initial
home_application
 [ ] 0001_initial
 [ ] 0002_auto_20191204_2347
 [ ] 0003_auto_20191205_1135
 [ ] 0004_auto_20191219_1745
 [ ] 0005_auto_20191223_1541
 [ ] 0006_auto_20200221_0006
 [ ] 0007_auto_20200320_1448
 [ ] 0008_auto_20200407_1422
 [ ] 0009_initial_team
 [ ] 0010_auto_20200422_1646
 [ ] 0011_excel
 [ ] 0012_checkobj_search_field
 [ ] 0013_auto_20210301_1600
 [ ] 0014_scriptitem_influence_level
 [ ] 0015_customfield
 [ ] 0016_auto_20210302_1505
 [ ] 0017_auto_20210302_1507
 [ ] 0018_paramset_snapshot
 [ ] 0019_auto_20210304_1116
 [ ] 0020_auto_20210304_1148
 [ ] 0021_reportitem_influence_level
 [ ] 0013_auto_20210304_2035
 [ ] 0022_merge
 [ ] 0023_htmlfile
 [ ] 0024_auto_20210427_1343
 [ ] 0025_scriptitem_description
 [ ] 0026_scriptitem_suggestions
 [ ] 0027_auto_20210521_1552
 [ ] 0028_auto_20210524_1546
 [ ] 0029_reports_report_name
 [ ] 0030_auto_20210729_1354
 [ ] 0031_auto_20210729_1413
 [ ] 0032_auto_20220221_1520
 [ ] 0033_menurole
 [ ] 0034_auto_20220302_2118
 [ ] 0035_auto_20220303_1908
 [ ] 0036_tasktimeset_unit
 [ ] 0037_auto_20220321_1918
 [ ] 0038_auto_20220321_2010
 [ ] 0039_auto_20220322_0931
sessions
 [X] 0001_initial
sites
 [X] 0001_initial

这里要注意,如果有其它数据库的状态有[x]变成了[ ],则该APP也要重置(因为外键的原因)
4. 删除migrations文件夹下面你要删除的migrations文件,除了__init__.py文件,包括pycache文件夹!
5. 执行下面的命令,再次为这个APP 生成 migrations文件
python manage.py makemigrations
6. 最后执行下面的命令,使刚刚生成的migrations 文件记录到django_migrations数据表中,大功告成。
py manage.py migrate --fake app

三、参考文章

  1. 【Django】将多个migrations合并为一个
  2. Django数据库操作 —— 干净的重置migration

Original: https://blog.csdn.net/qq_21918903/article/details/123660106
Author: 骑鱼的少年
Title: Django-合并migrations

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/733606/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球