一、背景
在开发一个迭代时,产生了很多migrations文件,而且这些migrations文件都是一个model表改来改去产生的,有必要将这个迭代的migrations文件在提测前合并成一个migrations文件。
二、操作方法
方法一:需要对已经初始化的库表做还原删除
- 直接将本次迭代所产生的migrations文件删除
- 执行命令
python manage.py makemigrations
生成一个新的migrations文件 - 去数据库中,找到
django_migrations
表,删除步骤2对应的记录 - 在数据库中,找到步骤2migrations文件所创建的表和字段,然后删掉
- 最后执行命令
python manage.py migrate
重新初始化数据库
方法二:不删除数据库,只是重新创建新的migrations文件
- 首先要保证,目前的migration文件和数据库是同步的,通过执行。
python manage.py makemigrations
- 查看当前项目下所有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
- 重置你的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