2011-10-06 116 views
2

我有几十次Rails数据库迁移,这些迁移是在一年内编写的。有没有办法将他们聚合到一个迁移中,以便我现在只会看到数据库的完整DDL语句?我只需要目前的快照,没有我们如何实现的所有历史。Rails中的聚合迁移

回答

3

这是可能的,但可能不是一个好主意聚合迁移!

也许会问:

  • 你为什么要这么做?
  • 你真的需要多久才能迁移到VERSION = 0然后再备份一次?
  • 是真的被打破了吗? (如果没有,那么不要修复它)

我曾经有同样的问题一次..我结束了只是重新排序我的迁移,因为架构的变化导致它不正确地迁移了/下来了。我会犹豫再次这样做。

如果您有只添加字段或索引的迁移,那么也许您可以将它们与模型的主迁移结合使用 - 但请注意,您不能再现旧的情况,例如,旧的DB转储可能与它们应该与兼容的迁移编号不兼容 - 这可能是反对汇总的最大论据...

从技术上讲,您可以转储架构然后直接加载 - 即一种方法:

rake db:schema:dump 

然后使用模式转储文件db/schema的内容创建一个新的迁移。RB

这里有一些类似的问题:


P.S:我认为应该坚持使用旧的迁移编号方案,其中迁移不使用时间戳 - 这对我来说工作得更好(更容易看到其中为了他们)。

例如在你的config/application.rb中的文件:

config.active_record.timestamped_migrations = false 
+0

感谢您的详细解答。我想要的直接原因是为了能够方便地查看数据库模式。由于Rails更喜欢自己完成许多关系型RDBMS任务(例如,参照完整性,约束),所以我想在一个地方看到它们。 –

+1

'rake db:schema:dump'就是我需要的。 –

+0

很高兴帮助! – Tilo

2

您可以简单地将当前模式加载到数据库中。

rake db:schema:load RAILS_ENV=[production, test, etc.]

这将需要的架构的schema.rb文件的版本,并将其加载到数据库而不运行单独的迁移。

注意:如果您有将数据放入数据库的迁移(例如,默认值),则该数据将不会添加到数据库中。

如果您需要将默认值加载到您的数据库中,那么可以通过自定义rake任务更好地完成,而无需考虑迁移。

2

你不应该使用所有的迁移,以获取数据库启动和运行。当前的schema.rb总是DB看起来像'现在'。

如果您在那里有大量的迁移,定期截取您的迁移是一种很好的做法。我们最终通过我们的一个较大的应用程序来做到这一点,从文件夹中删除了50个良好的迁移,因为唯一重要的是schema.rb。迁移就是这样,迁移并更改数据库的现有状态。他们应该只能运行一次。