何时(如果)整合ActiveRecord迁移?

当我移动我的应用程序*(s)的迭代时,我积累了迁移。 截至目前,有48个这样的文件,跨越了大约24个月的活动。

我正在考虑采取我目前的schema.rb并使之成为基准。

我也在考虑删除(当然是源代码控制)现有的迁移,并从我当前的模式创build一个不错的shiny的新的单一迁移? 迁移往往喜欢符号,但rake db:schema:dump使用string:我应该关心吗?

这似乎是合理的吗? 如果是这样的话,那么这样的一个练习是有意义的呢? 如果没有,为什么不呢?

我错过了一些(耙?)任务会为我做这个?

*在我的情况下,所有的应用程序都是基于Rails的,但是任何使用ActiveRecord迁移的东西似乎都适合这个问题。

是的,这是有道理的。 有一个巩固移民的做法。 为此,只需将当前模式复制到迁移中,然后删除所有先前的迁移。 然后,你有更less的文件来pipe理,并且testing可以运行得更快。 你需要小心这样做 ,特别是如果你有生产自动运行的迁移。 我通常会用一个新的模式replace我知道每个人都在运行的迁移。

其他人有不同的方式来做到这一点。

直到我们有超过100名的移民者,我一般都没有这样做,但经过几个月的发展,我们可以做到这一点。 然而,随着项目的成熟,迁移越来越less,所以你可能不需要再做。

这不符合最佳实践:一旦您签入到源代码pipe理的迁移,不要改变它。 如果有一个bug的话,我会发生一个罕见的例外,但是这是非常罕见的(百分之一)。 原因是一旦他们外出,有些人可能会跑他们。 他们被logging为在数据库中完成。 如果你改变他们,并检查一个新的版本,其他人不会得到改变的好处。 您可以要求人们回滚某些更改,然后重新运行它们,但是这会使自动化的目的失败。 经常做,它变得一团糟。 最好独自一人。

我认为有两种迁移:

  • 你在devise/开发过程中所做的,因为你改变了你的数据库应该是怎样的想法;

  • 在发布之间做出的那些反映了一些行为改变。

我尽快摆脱了第一种迁移,因为他们并不真正代表工作发布,并保留第二种迁移,所以理论上可以更新应用程序。

关于符号与string:许多人认为在迁移中只能使用string:符号是对象的“句柄”,不应该用来表示名字(在本例中为列名和表名)。 这仅仅是一种文体上的考虑,但是让我相信的是,我不再在移民中使用符号。

我已经读过使用string的另一点:“ ruby符号是内存泄漏 ”,这意味着,当您创build一个符号时,它永远不会被处理所有的应用程序的生命周期。 这对我来说似乎毫无意义,因为所有的db列将被用作Rails(和ActiveRecord)应用程序中的符号; 迁徙的任务也不会永远持续下去,所以我不认为这一点是有道理的。

有很多迁移是一件好事。 结合您的版本控制系统,您可以查看开发人员对数据库进行了哪些更改以及原因。 这有助于问责制。 删除它们只是使这一个很大的麻烦。

如果你真的希望获得一个新的数据库并且运行得很快,你可以使用rake db:schema:load RAILS_ENV = your_environment加载模式,如果你想快速获得testing数据库的设置,你可以使用rake db:test:prepare

这就是说,如果你真的想巩固你的迁移,那么我会创build一个新的迁移,检查你的集合中最后一次迁移是否已经执行(例如:你添加的列是否存在?),如果没有,那么它会开火。 否则,迁移只会将自己添加到架构表中,因为它不会尝试再次触发。

把你正在做的事情告诉你的团队其他人,这样他们就能明白发生了什么事情,以免他们盲目地掀起一个耙子数据库:迁移并搞砸了他们已有的东西。

schema.rb的顶部声明:

 # This file is auto-generated from the current state of the database. Instead of editing this file, # please use the migrations feature of Active Record to incrementally modify your database, and # then regenerate this schema definition. # # Note that this schema.rb definition is the authoritative source for your database schema. If you need # to create the application database on another system, you should be using db:schema:load, not running # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations # you'll amass, the slower it'll run and the greater likelihood for issues). # # It's strongly recommended to check this file into your version control system. 

我必须赞同上面所说的不同目的的不同迁徙。 我build议您清理面向开发的迁移以及在分支发布时执行的其他任务。 对于我自己和小团队来说,这样做的效果很好。 当然,我的主要应用程序位于其他两个数据库之间,并有自己的模式,我必须小心,因此我们使用迁移(而不是模式还原)来进行新的安装,并且需要在发布工程时保留这些数据库。

尽pipe我确信每个人都有自己的做法,但迁移系统的工作方式却暗含着一些规则:

  • 切勿对其他开发人员或以前的部署可能使用的迁移进行更改。 相反,进行额外的迁移以根据需要进行调整。
  • 永远不要在模型层次上依赖于迁移。 该模型可能会在未来的某个时间点重新命名或删除,这将阻止迁移。 保持迁移尽可能独立,即使这意味着它非常简单和低级。

当然,也有例外。 例如,如果迁移不起作用,无论出于何种原因,可能需要补丁才能使其更新。 但即使如此,移徙造成的变化的性质也不应该改变,尽pipe这些变化的实施可能会发生。

任何成熟的Rails项目可能会有大约200到1000个迁移。 根据我的经验,除计划阶段外,看到一个项目less于30个是不寻常的。 毕竟,每个模型通常都需要自己的迁移文件。

将多个迁移合并为一个单一的迁移是一个不断发展的软件工作的坏习惯。 你可能不会折叠你的源代码pipe理历史,那么为什么要担心数据库模式的历史?

我认为唯一合理实际的情况是,如果你正在分一个旧的项目来创build一个新的版本或者分拆,而不想继续进行非常多的迁移。

你不应该删除迁移。 为什么要创造额外的工作?

迁移本质上是一组定义如何构build数据库以支持您的应用程序的指令。 在构build应用程序时,迁移将logging对数据库进行的迭代更改。

恕我直言,通过定期重置基线,您正在进行更改,有可能引入错误/问题与您的应用程序,创造额外的工作。

如果某列错误添加,然后需要删除,只需创build一个新的迁移以删除多余的列。 我的主要原因是,在一个团队工作时,你不希望你的同事不得不从头开始重build数据库。 有了这个简单的方法,你(和他们)可以进行迭代的工作。

顺便说一句,从头开始构build新的数据库(没有任何数据),迁移往往会非常快速地运行。 我目前正在进行的一个项目有177个迁移,这在build立一个新的数据库时不会造成任何问题。