django migrations管理策略 - oceanbei333/leetcode GitHub Wiki
migrations 的git管理
首先,migrations建议纳入管理
-
避免migrations的丢失,如果丢失,需要通过重置生成新的migrations文件,但是前提是当前的数据库表和当前代码是对应的,否则的话,必须回退到对应的代码版本中
-
保证不同的环境运行相同的迁移文件,进而保证迁移结果一样
其次,如何提交migrations
-
提交之前,丢弃本地的migrations变更,并将数据库回滚到最新的一次提交(如果确定,没有其他人,可以忽略这一步)
python app/manage.py migrate {app_label} {migrations file name}
-
提交代码,并拉取最新代码
-
生成新的migrations文件,并在此提交,push到云端,如果此时正好有人提交了,那么在此拉取代码,如果冲突,解决冲突
migrations的重置
如果有多个环境的拥有独立的migrations文件,那么就将各个环境的migrations重置,使用同一的migrations文件
- 在某个环境中,使用最新的commit重置migrations,生成新的migrations,并提交到git
- 在其他环境中,使用上一步的重置的commit提交数据库变更,再拉取上一步的migrations进行migration是重置
或者,确定环境数据不重要的话,也可以删库操作,但是可以建议使用以下步骤迁移,加深对于数据库迁移的理解
重置步骤
-
提交当前代码版本的数据库变更
-
重置migrations文件
python manage.py migrate --fake 应用名称 zero
-
删除migrations文件夹下的文件,包括关联app的migrations文件,比如admin或者引用的第三方app
具体有哪些,可以查看
python manage.py showmigrations
所有没有X的都是受影响的提交
admin [X] 0001_initial [X] 0002_logentry_remove_auto_add [X] 0003_logentry_add_action_flag_choices api [X] 0001_initial contenttypes [X] 0001_initial [X] 0002_remove_content_type_name explore [ ] 0001_initial [ ] 0002_auto_20200223_0131 [ ] 0003_delete_exphoto [ ] 0004_exphoto [ ] 0005_auto_20200304_1652 parent [X] 0001_initial [ ] 0002_auto_20200409_2248
-
重新生成migrations
重新生成,或者使用其他环境的git提交的migrations(保证是同一个commit的迁移文件)
-
在数据库中的migrations表记录migrate的行为,但不执行migrations文件中的代码
python manage.py migrate 应用名称 --fake
-