2009-09-28 64 views
42

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

我考虑采取我目前schema.rb,使该基线。

,我也在考虑删除(如有源控制,当然)现有的迁移和创建从我的我的当前模式一个很好的闪闪发光的新单迁移?迁移通常喜欢符号,但rake db:schema:dump使用字符串:我应该在意吗?

这似乎是合理的吗? 如果是这样,那么这样的练习在什么样的时间间隔是有意义的? 如果不是,为什么不呢?

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

*就我而言,所有的应用程序都是基于Rails的,但任何使用ActiveRecord迁移的应用程序似乎都适合这个问题。

+0

迈克,你使用注释? http://weblog.rubyonrails.org/2006/3/3/annotated-models它解决了大部分的原因想要做这个摆在首位 – 2009-09-30 01:24:48

回答

34

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

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

直到我们有超过100次的迁移,我一般都没有这样做,但我们可以在几个月的开发后达成此目标。然而,随着项目的成熟,迁移越来越少,所以你可能不需要再做一次。

这确实违背了最佳实践:一旦您签入到源代码管理的迁移,请不要更改它。如果有一个bug存在,我会发生一个罕见的异常,但这种情况非常罕见(100个中有1个)。原因是,一旦他们在野外,有些人可能已经跑了他们。他们被记录为在数据库中完成。如果您更改并检入新版本,其他人将无法从中获益。您可以让人们回滚某些更改,然后重新运行它们,但这会破坏自动化的目的。经常做,它变得一团糟。最好独自一人。

+0

因此,例如,一旦我运行迁移到生产环境中,为什么要继续运行旧的迁移?要建立一个新的数据库,对于一个新的开发/测试环境,比方说,我应该只是db:schema:加载到基线,然后运行新的迁移。这似乎是明智的。毕竟,我将始终在旧的源代码版本中进行原始迁移。 – 2009-09-29 21:31:45

+0

我们的自动化测试环境做了分贝:复位并运行各组测试前,所有的迁移,这就是真正的迁移是通过充分,其中重做迁移是有帮助的运行之时。人们清理它们只是为了减少文件数量。当然,db:schema:load会起作用......我认为其背后的想法是,您将对迁移进行一些测试,作为持续集成的一部分。 – ndp 2009-09-30 03:48:19

7

我认为有两种迁移:

  • 那些你设计/开发过程中做出的,因为你对你的分贝应该是怎么样的改变了主意;

  • 你所发行版之间,这反映了一些行为的变化。

我得到,只要我能摆脱第一类迁移的,因为他们并不真正代表工作的版本,并保持第二类,所以它是可能的,在理论上,更新的应用。

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

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

+0

只是一个随机注:关于符号/字符串: 如果一个符号使用了10次,它只占用一次内存。当使用一个字符串时(假设一个字符串),它每次在代码中占用所需的内存。所以这个符号可能永远不会GC'd,只有它一个。 – 2009-12-11 18:09:37

0

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

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

恕我直言,通过定期重置基线你制作的就来介绍一下您的应用程序的错误/问题的潜在变化,创造额外的工作。

在一列被错误添加,然后需要进行一段时间后取出的情况下,只需要创建一个新的迁移,除去额外的列。我的主要原因是,在一个团队中工作时,你不希望你的同事不得不从头开始重建他们的数据库。通过这种简单的方法,你(和他们)可以以迭代的方式继续工作。另外 - 从头开始​​构建新数据库(没有任何数据)时,迁移往往会非常快速地运行。我目前正在进行的项目有177个迁移,这在建立新数据库时不会造成任何问题。

1

虽然我敢肯定,每个人都有自己的做法,还有由迁移系统的工作方式隐含了一些规则:

  • 决不承诺可能已经被其他开发商或先前部署的变化迁移。相反,进行额外的迁移以根据需要进行调整。
  • 永远不要在迁移中放置模型级依赖关系。该模型可能会在未来的某个时间点重新命名或删除,这将阻止迁移。尽可能保持迁移的独立性,即使这意味着它非常简单和低级。

当然也有例外。例如,如果迁移不起作用,无论出于何种原因,可能需要补丁才能使其更新。尽管如此,尽管实施这些措施可能会改变迁移影响的性质,但不应改变。

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

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

我唯一可以看到它是合理实用的场合是,如果你分出一个旧项目来创建一个新版本或分拆并且不想继续进行非常多的迁移。

+0

一个复杂的成熟项目可能会经历一个或多个重要的数据库重构,而迁移可以“调整”事物以支持每个重构。随着时间的推移,当从头到尾直接运行所有迁移时,这些与重构相关的迁移可能会出现问题。在这些情况下,可能有利于折叠较旧的迁移。 – 2014-01-02 21:29:56

+0

如果你打,你就有了“太多”迁移的时候,你可以随时它们全部关闭,以当前的'DB/schema.rb'的快照。请记住,成熟的项目通常需要自定义数据库快照,因此从头开始迁移的人数应该很少。除非你有成千上万的迁移,否则它可能不值得重写历史。它通常具有意想不到的副作用。 – tadman 2014-01-06 15:50:44

2

模式的顶部。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. 

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

3

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

如果您确实想要快速启动并运行新数据库,只需使用rake db:schema:load RAILS_ENV = your_environment加载模式,并且如果您希望快速获得测试数据库设置,则可以使用rake db :测试:准备

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

只是传达你在做你的团队的其余部分是什么让他们明白是怎么回事,以免他们盲目地把火关耙分贝:迁移和搞砸了的东西,他们已经有了。