【发布时间】:2011-10-06 18:35:21
【问题描述】:
我有几十个 Rails 数据库迁移,这些迁移是在一年多的时间里编写的。有没有办法将它们聚合到一个迁移中,这样我就可以看到现在存在的数据库的完整 DDL 语句?我只需要当前的快照,而不需要我们如何获得它的所有历史记录。
【问题讨论】:
标签: ruby-on-rails database migration
我有几十个 Rails 数据库迁移,这些迁移是在一年多的时间里编写的。有没有办法将它们聚合到一个迁移中,这样我就可以看到现在存在的数据库的完整 DDL 语句?我只需要当前的快照,而不需要我们如何获得它的所有历史记录。
【问题讨论】:
标签: ruby-on-rails database migration
有可能,但可能不是一个好主意聚合迁移!
也许会问:
我曾经遇到过同样的问题。我最终只是重新排序了我的迁移,因为架构中的更改导致它不再正确地向上/向下迁移。我会犹豫再做一次。
如果您有只添加字段或索引的迁移,那么也许您可以将它们与模型的主要迁移结合起来——但请注意,您不能再重现旧情况,例如较旧的数据库转储可能与它们应该兼容的迁移编号不兼容——这可能是反对聚合的最大论据......
从技术上讲,您可以转储架构,然后直接加载它 - 这是一种方式:
rake db:schema:dump
然后使用模式转储文件 db/schema.rb 的内容创建一个新的迁移
这里有一些类似的问题:
P.S.:我发现坚持使用旧的迁移编号方案很有用,其中迁移不使用时间戳 - 对我来说这样效果更好(更容易看到它们的顺序)。
例如在您的 config/application.rb 文件中:
config.active_record.timestamped_migrations = false
【讨论】:
rake db:schema:dump 是我需要的。
您永远不应该使用所有迁移来启动和运行数据库。当前的 schema.rb 始终是数据库“当前”的样子。
如果其中有大量迁移,最好定期截断迁移。我们终于用我们的一个更大的应用程序做到了这一点,从文件夹中删除了 50 个迁移,因为唯一重要的是 schema.rb。迁移就是一种迁移并对数据库的现有状态进行更改的方法。它们应该只需要运行一次。
【讨论】:
您可以简单地将当前架构加载到数据库中。
rake db:schema:load RAILS_ENV=[production, test, etc.]
这将采用 schema.rb 文件的架构版本,并将其加载到数据库中,而无需运行单独的迁移。
注意:如果您有将数据放入数据库的迁移(例如,默认值),则不会将这些数据添加到数据库中。
如果您需要将默认值加载到数据库中,最好通过自定义 rake 任务来完成,而与迁移无关。
【讨论】: