Django不删数据 重建migration文件

Published on 2018 - 10 - 17

场景一:不需要原有的数据,完全重置数据库

  1. 删除数据库所有的表,或会直接删除数据库重建
  2. 删除项目的migration模块中的所有 文件,除了init.py 文件

  3. 执行脚本
    python3 manage.py migrate
    python3 manage.py makemigrations 
    

场景2:保留数据库中的数据,只重新建立 migration 文件

  1. 首先要保证,目前的migration文件和数据库是同步的,通过执行
    python3 manage.py makemigrations 
    如果看到 这样的提示: No changes detected,则可以继续接下来的步骤
    
  2. 查看目前存在的App
    python3 manage.py showmigrations
    结果,可以看到当前项目,所有的app及对应的已经生效的migration文件如下:
    
    admin
    [X] 0001_initial
    [X] 0002_logentry_remove_auto_add
    [X] 0003_logentry_add_action_flag_choices
    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
    [X] 0007_alter_validators_add_error_messages
    [X] 0008_alter_user_username_max_length
    [X] 0009_alter_user_last_name_max_length
    contenttypes
    [X] 0001_initial
    [X] 0002_remove_content_type_name
    nginxAuto
    [X] 0001_initial
    [X] 0002_servername_key_test
    [X] 0003_remove_servername_key_test
    sessions
    [X] 0001_initial
    
  3. 通过执行
    python3 manage.py migrate --fake nginxAuto zero
    

    这里的 nginxAuto就是你要重置的app
    之后再执行 python manage.py showmigrations,你会发现 文件前的 [x] 变成了[ ]

  4. 删除pay 这个 app下的migrations模块中 除 init.py 之外的所有文件。

    python3 manage.py makemigrations
    
  5. 同步migration文件与数据库进度对应
    python3 manage.py migrate --fake-initial
    

    --fake-inital 会在数据库中的 migrations表中记录当前这个app 执行到 0001_initial.py ,但是它不会真的执行该文件中的 代码。

    这样就做到了,既不对现有的数据库改动,而又可以重置 migraion 文件,