从架构生成Rails迁移

时间:2011-04-01 00:17:52

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

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

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

2 个答案:

答案 0 :(得分:15)

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

rake db:schema:dump

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

答案 1 :(得分: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秒,而execute语句在20秒内重新生成并重新填充表。在定期修订初始内容或定期修订表格规范的项目中,这当然是一个重大问题。

  • 也许同样重要的是,您可以通过在执行的SQL语法中维护单个原始迁移并重新执行(单个文件的)迁移来保留此重建和重新填充速度,方法是先删除schema.rb然后运行rake db:在重新填充表之前重置。确保你设置:version =&gt; 0,这样您就可以获得一个新的模式,忠实到您的迁移中:

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