【问题标题】:Aggregate migrations in RailsRails 中的聚合迁移
【发布时间】:2011-10-06 18:35:21
【问题描述】:

我有几十个 Rails 数据库迁移,这些迁移是在一年多的时间里编写的。有没有办法将它们聚合到一个迁移中,这样我就可以看到现在存在的数据库的完整 DDL 语句?我只需要当前的快照,而不需要我们如何获得它的所有历史记录。

【问题讨论】:

    标签: ruby-on-rails database migration


    【解决方案1】:

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

    也许会问:

    • 您为什么要这样做?
    • 您真正需要多久迁移一次,一直迁移到 VERSION=0,然后再次备份?
    • 真的有东西坏了吗? (如果不是,则不要修复它)

    我曾经遇到过同样的问题。我最终只是重新排序了我的迁移,因为架构中的更改导致它不再正确地向上/向下迁移。我会犹豫再做一次。

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

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

    rake db:schema:dump
    

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

    这里有一些类似的问题:


    P.S.:我发现坚持使用旧的迁移编号方案很有用,其中迁移不使用时间戳 - 对我来说这样效果更好(更容易看到它们的顺序)。

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

    config.active_record.timestamped_migrations = false
    

    【讨论】:

    • 感谢您的详细解答。我想要它的直接原因只是为了能够方便地查看数据库模式。由于 Rails 更喜欢自己执行许多常见的 RDBMS 任务(例如,参照完整性、约束),我希望在一个地方看到它们。
    • rake db:schema:dump 是我需要的。
    【解决方案2】:

    您永远不应该使用所有迁移来启动和运行数据库。当前的 schema.rb 始终是数据库“当前”的样子。

    如果其中有大量迁移,最好定期截断迁移。我们终于用我们的一个更大的应用程序做到了这一点,从文件夹中删除了 50 个迁移,因为唯一重要的是 schema.rb。迁移就是一种迁移并对数据库的现有状态进行更改的方法。它们应该只需要运行一次。

    【讨论】:

      【解决方案3】:

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

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

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

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

      如果您需要将默认值加载到数据库中,最好通过自定义 rake 任务来完成,而与迁移无关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多