2011-04-01 111 views
9

我正在创建一个新的Rails应用程序,它将与现有模式一起工作。我得到了模式SQL,但我想创建Rails迁移来填充开发中的数据库。该模式不是太复杂,有大约20个表格,但我不想浪费时间并通过手动创建迁移来冒险输入错误。从模式生成Rails迁移

有没有一种方法可以生成模式的SQL的Rails迁移?

+0

不得不承认,不容易被发现的重复:HTTP:// stackoverflow.com/questions/2754771/can-i-generate-a-ruby-on-rails-database-migration-file-from-a-mysql-sql-file – Spyros 2011-04-01 00:33:20

+0

完全同意 - 这是另一个的重复。 – 2011-04-01 13:25:29

+1

对不起,它是重复的。我搜索,但无法找到类似的答案。 – AaronThomson 2011-04-03 22:49:37

回答

13

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

rake db:schema:dump 

这会给你一个DB/schema.rb愿与所有的定义。现在您已经拥有该db/schema.rb,只需将声明中的内容复制到新的迁移中即可。我之前完成了这个工作,而且工作得很好。

4

我喜欢简单地用SQL的执行调用写在初始迁移的方式:报名

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语法。例如,我们的表格需要55秒才能从Ruby语法的Rails迁移中重建,而execute语句会在20秒内重新生成并重新填充表格。这对于定期修订初始内容或定期修订表格规格的项目当然是一个实质性问题。

  • 也许同样重要的是,您可以保留此重建,并通过在执行的SQL语法中保持单一原始迁移并重新执行(单个文件的)迁移来重新加速,方法是首先将您的schema.rb删除,然后运行rake db:在重新填充表格之前重置。请确保您设置:版本=> 0,这样你会得到一个新的模式,忠实到迁移:

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

我不喜欢迁移中的原始SQL,因为ORM不能包装不同的数据库。速度较慢,但​​您购买便携性。也许这不是每个人需要的成本 – 2013-04-05 13:33:39

+2

不。实际上,这个想法干扰了利用你为其优点选择的数据库的必要练习。如果您打算并需要依靠Postgres的BigSerial类型,则必须在公牛的角上采取行动。 Ruby当然有意隐藏所有那些“复杂性”,就好像漠不关心和不可访问是美德一样。所以,我们有“帮助”(雇佣的手)隐藏我们故意使用的数据类型,就好像他们在帮我们一样! – 2013-08-22 16:03:43