Migrantion 是 Django 最有用的的特性之一,但是对于我来说改变 Model 这是一个很可怕的任务。尽管能够阅读文档,我仍然很害怕 migration 的冲突或者丢失数据,或者需要手动处理 migration 文件,或者这样那样的事情。事实上,一旦理解它们,migration 是很酷的、很有用的。关于以上的问题你将不会有任何疑问。

翻译自 Oana Ratiu 的《Django Migrations and How to Manage Conflicts

我一直不能找到一些有价值的文章和文档,也许在某个地方,所有的方法都可以解决冲突。然而从来没有人在 Google 上仔细的搜索。在这些问题上我会尝试收集一些不同角度。主要的是,我会尝试去解释你可以在项目中找到的那些 migrations,如何解决 migration 的冲突,和一些数据迁移的。我会假定你是有 Django、Python 和 GIT 的使用经验。

在 Django 的文档中对 migrations 的简单定义

Migrantion 是 Django 根据你的想法,改变 Model (添加字段、删除 Model 等)到数据库中的方法。它们大多数是自动的,但是你需要知道什么时候执行 migrations,执行它们时候,你可能会遇到的问题。

无论你选择是的 PostgreSQL, MySQL 还是 SQLite,你都可以使用一套命令去管理数据库。我将会较多的谈论关于 makemigrations 命令,它会基于你对 Model 的改动,然后创建新的 migrations。还有就是 migrate 命令,它会使 migrations 生效,完成后使它们失效和列出它们状态。

我的 migrations 在哪里?

在你的工程中,你可以找到 migrations 文件(.py 的文件)在 migrations 的文件夹里。确保文件夹中有 __init__.py 这个文件,如果没有这个文件,那么还是没有效果。

在你的 settings 文件中每个已安装的 app,你都可以找到对应得 migration 文件。例如,你可以在…/lib/python2.7/site-packages/django/contrib/auth/migrations 找到 User 的 migration。

你可以在你的数据库中找到 django_migrations 表,它列出了已经生效的 migrations。这是为了在切换分支的时候产生不同的 migrations,让你忘记执行到了哪里。

my_data=# select * from django_migrations;
 id |      app      |          name           |            applied            
----+---------------+-------------------------+-------------------------------
 .. |     ...       |          ...            |             ...             
 10 | myapp         | 0001_initial            | 2016-03-17 07:22:30.329448+00
 11 | myapp         | 0002_auto_20160316_0909 | 2016-03-17 07:22:30.956985+00
 12 | myapp         | 0003_auto_20160318_1345 | 2016-03-18 13:45:23.895839+00
 .. |     ...       |          ...            |             ...             
(16 rows)