django 开发——重建 migrations

个人来说还是比较讨厌 django 的这套机制的,相当的不自由,数据库的改动往往会导致 migrations 文件无法合并,很多情况下我们只能重新生成。也可以看我之前的博文,关于如何备份数据并重新生成导入数据。

情景一:放弃原有的数据库数据

  1. 删除数据库所有的表
  2. 删除项目的 migration 模块中的所有 文件,除了 __init__.py 文件
  3. 执行脚本 
$ python manage.py makemigrations
$ python manage.py migrate

情景二:不想删除现有的数据库,只想重新建立 migrations 文件

1、首先要保证,目前的migration文件和数据库是同步的,通过执行

$ python manage.py makemigrations
# 如果看到 这样的提示: No changes detected,则可以继续接下来的步骤

2、通过执行

$ python manage.py showmigrations
# 结果,可以看到当前项目,所有的app及对应的已经生效的migration文件如
accounts
 [X] 0001_initial
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
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
blog
 [X] 0001_initial
 [X] 0002_auto_20161218_1753
 [X] 0003_auto_20161219_1010
 [X] 0004_auto_20161220_1417
 [X] 0005_auto_20170110_2030
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial
simplePage
 [X] 0001_initial
sites
 [X] 0001_initial
 [X] 0002_alter_domain_unique

通过执行

$ python manage.py migrate --fake blog zero

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

现在,你可以删除pay 这个 app下的migrations模块中 除 init.py 之外的所有文件。

之后,执行

$ python manage.py makemigrations

程序会再次为这个app 生成 0001_initial.py 之类的文件

最重要的一步来了, 执行

$ python manage.py migrate --fake-initial

--fake-inital 会在数据库中的 migrations 表中记录当前这个 app 执行到 0001_initial.py ,但是它不会真的执行该文件中的代码。 
这样就做到了,既不对现有的数据库改动,而又可以重置 migraion 文件,再也不用在 migration模块中看到一推文件了。