我正在创建一个新的Rails应用程序,它将与现有架构一起使用。我已经获得了模式SQL,但我想创建Rails迁移以在开发中填充数据库。架构并不过分复杂,大约有20个表,但我不想浪费时间并通过手动创建迁移来冒犯错误。
有没有办法在给定模式的SQL的情况下生成Rails迁移?
答案 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