为啥需要将 django 迁移推送到版本控制系统

Posted

技术标签:

【中文标题】为啥需要将 django 迁移推送到版本控制系统【英文标题】:Why there is need to push django migrations to version control system为什么需要将 django 迁移推送到版本控制系统 【发布时间】:2015-11-29 07:34:37 【问题描述】:

这是一种常见的做法,从事 django 项目的人通常会将迁移与其他代码一起推送到版本控制系统。

我的问题是为什么这种做法如此普遍?为什么不只是推送更新的模型,每个人都在本地生成迁移。这种方法也可以减少解决迁移冲突的工作量。

【问题讨论】:

【参考方案1】:

如果您没有将它们提交给 VCS,那么将会发生的情况是人们会对模型进行潜在的冲突更改。

当最终准备好部署时,您仍然需要 django 进行新的迁移,然后将每个人的更改合并在一起。而这只会创建一个额外的不必要的步骤,可能会引入错误。

您还假设每个人都将始终能够处理最新版本的代码,当您开始处理尚未准备好合并到主线中的分支时,这并不总是可能的。

【讨论】:

一个例子是:A 从master 创建了一个分支并创建了一个新的迁移0010,B 从master 创建了一个分支并创建了一个新的迁移0010。 A 合并开发早于 B,当 B 拉取最新更改并尝试将他的代码合并到 master 时,他得到了重复迁移。如果你不跟踪迁移,B 会很困惑。 OP 建议推送模型文件并从中生成迁移,应该注意这一点。我自己也想过这个问题。解决不一致的迁移,特别是对于共享分支和正在进行的工作,是一种巨大的时间浪费。我在下面看到@alasdair 关于自动填充的观点(这是对我来说有意义的一个例外,尽管如果您使用工厂而不是自定义迁移,则它不适用)。我希望看到有关避免迁移冲突的最佳做法的更好建议,和/或解决这些冲突的更好工具。 例如,我刚刚遇到了一个我经常遇到的问题,当我尝试迁移时缺少合并依赖项。问题是,不同应用程序中的迁移文件并不总是跨分支同步。 django 错误不会给你导致问题的迁移文件的完整路径,只有数字。 #失败 @szeitlin - 我鼓励你就你的问题提出一个新问题,请随时参考这个问题 谢谢!我认为***.com/questions/3550887/… 可能有助于解决我当前的问题,但我可能仍然会问关于如何最好地管理共享迁移的更大问题。以下来自@knbk re 的答案:测试也让我感兴趣。【参考方案2】:

迁移将数据库的状态与代码的状态同步。如果您不将迁移签入到版本控制中,您将失去中间步骤。您将无法返回版本控制历史并仅运行代码,因为数据库在那个时间点不会匹配模型。

与任何代码一样,迁移应该至少在基本级别上进行测试。即使它们是自动生成的,也不能保证它们 100% 的时间都可以工作。因此,安全的路径是在您的开发环境中创建迁移,测试它们,然后将它们推送到生产环境以在那里应用它们。

【讨论】:

您能否举例说明您为此使用了哪些类型的测试?您是否检查数据总体?【参考方案3】:

首先,版本控制中的迁移允许您在生产中运行它们。

其次,迁移并不总是自动生成的。例如,如果您向模型添加一个新字段,您可能会编写一个迁移来填充该字段。无法从模型重新创建该迁移。如果该迁移不受版本控制,那么其他人将无法运行它。

【讨论】:

但是我们也可以在生产环境中生成迁移,然后应用这些迁移。这种方法有问题吗? 是的,理论上您可以在生产环境中生成迁移(尽管不是自定义迁移,如上所述)。但是,如果您需要在更新代码之前运行迁移(例如添加新模型时),在生产环境中创建迁移可能会导致问题。 @Alasdair 所说的是您应该跟踪它们,因为您可能需要数据迁移(自定义迁移)。在某些情况下,人们手动编写迁移以实现填充初始数据等操作。如果您不将它们保存在版本控制中,您就会忘记这些步骤。

以上是关于为啥需要将 django 迁移推送到版本控制系统的主要内容,如果未能解决你的问题,请参考以下文章

Heroku:Django Migration 版本未在部署中运行

为啥当我尝试将我的 Spring Boot 应用程序推送到 heroku 时它返回“致命错误编译:无效目标版本:11”

为啥不需要的数据被推送到我的阵列中?

GCP - 谷歌云平台:有没有任何方法可以在没有任何版本控制系统的情况下将代码从 eclipse 推送到云端?

为啥不将数据库查询中的移动结果推送到变量中?

为啥 AWS amplify 无法识别更新的节点版本?