Django 的迁移是什么?

What is Django's migration?

一段时间以来,我一直在思考这个概念, 当我开始一个新的 Django 项目时,它敦促我应用迁移:

# python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

为什么我需要这样做?谁能给出 migration?

的简明解释和简单用例

编辑:我决定发布这个问题,因为我在 Whosebug 上没有看到任何类似的问题,也许有比文档中更好的解释。

这些迁移是针对 Django 默认创建的模型,例如用户、组和权限。

如果您不打算使用它们,您可以在设置中将这些应用程序注释掉。否则,您需要 运行 这些迁移来为您的应用程序创建所需的表。

迁移是管理数据库模式更改的好方法。这有两个主要好处(在我看来):

1 - 如果您有一个应用程序的多个实例 - 开发 + 生产是典型的最低限度,但可能是由其他人安装的应用程序(独立或与其他 Django 应用程序一起安装),迁移允许您,开发人员, 以安全和受控的方式传播数据库架构更改。您可以保证您的应用程序的任何最新版本(即,包括您最新的数据库模型)都将有一个正常运行的数据库来匹配。所以一般的答案是迁移以相对优雅的方式解决了一个非常普遍的问题。

2 - 具体来说,如另一个答案中所述,存在初始迁移,即使对于与用户和权限相关的绝对全新的 Django 项目也是如此。我能想到的任何重要的 Django 应用程序都需要这些表才能运行——也就是说,如果您不使用它们,那么可以说,您将无法从 Django 作为框架提供的大部分内容中获益。通过包括迁移,开发人员可以决定使用哪个数据库(SQLite、MySQL、PostgreSQL 等)以及该数据库将驻留的位置,一旦您进行了这些设置(通常在 settings.py项目),迁移负责其余部分。

migrate 命令获取所有尚未应用的迁移(Django 使用数据库中名为 django_migrations 的特殊 table 跟踪应用了哪些迁移)并针对您的数据库运行它们 -本质上,将您对模型所做的更改与数据库中的模式同步。

迁移功能非常强大,让您可以随着时间的推移在开发项目时更改模型,而无需删除数据库或 tables 并创建新的 - 它专门用于实时升级数据库, 而不会丢失数据。我们将在本教程的后面部分更深入地介绍它们,但现在,请记住进行模型更改的三步指南:

更改模型(在 models.py 中)。

运行 python manage.py makemigrations 为这些更改创建迁移

运行 python manage.py 迁移以将这些更改应用到数据库。

之所以有单独的命令来进行和应用迁移,是因为您将向版本控制系统提交迁移并将它们与您的应用程序一起发布;它们不仅使您的开发更容易,而且可供其他开发人员和生产使用。