2011-04-01 72 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