django migrations管理策略 - oceanbei333/leetcode GitHub Wiki

migrations 的git管理

首先,migrations建议纳入管理

  1. 避免migrations的丢失,如果丢失,需要通过重置生成新的migrations文件,但是前提是当前的数据库表和当前代码是对应的,否则的话,必须回退到对应的代码版本中

  2. 保证不同的环境运行相同的迁移文件,进而保证迁移结果一样

其次,如何提交migrations

  1. 提交之前,丢弃本地的migrations变更,并将数据库回滚到最新的一次提交(如果确定,没有其他人,可以忽略这一步)

    python app/manage.py migrate {app_label} {migrations file name}

  2. 提交代码,并拉取最新代码

  3. 生成新的migrations文件,并在此提交,push到云端,如果此时正好有人提交了,那么在此拉取代码,如果冲突,解决冲突

migrations的重置

如果有多个环境的拥有独立的migrations文件,那么就将各个环境的migrations重置,使用同一的migrations文件

  1. 在某个环境中,使用最新的commit重置migrations,生成新的migrations,并提交到git
  2. 在其他环境中,使用上一步的重置的commit提交数据库变更,再拉取上一步的migrations进行migration是重置

或者,确定环境数据不重要的话,也可以删库操作,但是可以建议使用以下步骤迁移,加深对于数据库迁移的理解

重置步骤

  1. 提交当前代码版本的数据库变更

  2. 重置migrations文件

    python manage.py migrate --fake 应用名称 zero
    
  3. 删除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
    
    1. 重新生成migrations

      重新生成,或者使用其他环境的git提交的migrations(保证是同一个commit的迁移文件)

    2. 在数据库中的migrations表记录migrate的行为,但不执行migrations文件中的代码

      python manage.py migrate 应用名称 --fake