11

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

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

4

2 回答 2

15

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

rake db:schema:dump

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

于 2011-04-01T00:56:54.067 回答
5

我更喜欢用 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,然后在 re 之前运行 rake db:reset - 填充您的表格。确保你设置了 :version => 0,这样你就会得到一个新的模式,忠实于你的迁移:

    ActiveRecord::Schema.define(:version => 0) do  
    end
    
于 2012-09-09T18:31:24.693 回答