【问题标题】:Generate Rails migrations from a schema从模式生成 Rails 迁移
【发布时间】:2011-07-27 08:19:24
【问题描述】:

我正在创建一个新的 Rails 应用程序,它将与现有架构一起使用。我已获得架构 SQL,但我想创建 Rails 迁移以填充开发中的数据库。架构并不太复杂,大约有 20 个表,但是我不想通过手动创建迁移来浪费时间和冒险拼写错误。

有没有办法在给定架构的 SQL 的情况下生成 Rails 迁移?

【问题讨论】:

  • 不得不承认,不容易找到重复的:stackoverflow.com/questions/2754771/…
  • 完全同意 - 这是另一个副本。
  • 是的,抱歉,它是重复的。我搜索了但找不到类似的答案。

标签: sql ruby-on-rails database rails-migrations


【解决方案1】:

当然,将您的应用程序连接到数据库,然后运行

rake db:schema:dump

这将为您提供一个包含所有定义的 db/schema.rb。现在您已经有了 db/schema.rb,只需将声明中的内容复制到新的迁移中即可。我以前做过,效果很好。

【讨论】:

    【解决方案2】:

    我更喜欢用 SQL 执行调用简单地编写初始迁移的 up 方法:

    class InitialDbStructure < ActiveRecord::Migration
        def up
            execute "CREATE TABLE abouts (
                id INTEGER UNSIGNED AUTO_INCREMENT,
                updated_at TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                created_at TIMESTAMP,
    
                title VARCHAR(125),
                body MEDIUMTEXT,
    
                CONSTRAINT PK_id PRIMARY KEY (id),
                INDEX ORDER_id (id ASC)
                ) ENGINE=InnoDB;"
            end
    

    注意事项

    • 您会发现,特别是如果您经常重建和重新填充表 (rake db:drop db:create db:schema:load db:fixtures:load),执行语句的运行速度远远快于解释语句Ruby 语法。 例如,使用 Ruby 语法从 Rails 迁移重建表需要超过 55 秒,而执行语句会在 20 秒内重新生成和重新填充我们的表。这在定期修订初始内容或定期修订表格规范的项目中当然是一个重大问题。

    • 也许同样重要的是,您可以通过在执行的 SQL 语法中维护单个原始迁移并通过首先删除 schema.rb 然后运行 ​​rake db 重新执行(该单个文件的)迁移来保持这种重建和重新填充速度:在重新填充表格之前重置。确保您设置了 :version => 0,这样您将获得一个新架构,忠实您的迁移:

      ActiveRecord::Schema.define(:version => 0) do  
      end
      

    【讨论】:

    • 我不喜欢迁移中的原始 SQL,因为 ORM 无法包装不同的数据库。它速度较慢,但​​您购买了便携性。也许这不是每个人都需要的成本
    • 没有。事实上,这个想法干扰了使用您选择的数据库的必要练习。例如,如果您打算并且需要依赖 Postgres 的 BigSerial 类型,那么您必须采取行动。 Ruby 当然打算隐藏所有的“复杂性”,就好像冷漠和难以接近是美德一样。所以,我们有“帮助”(雇来的人)隐藏我们对数据类型的有意使用,就好像他们在帮我们一个忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多