2011-10-03 60 views
0

我有一個運行在MySql數據庫上的Rails應用程序。Rails/MySql遷移合併

有沒有合併遷移的方法? 例如:

可以說我有一個名爲members非常大的表,我創建一個遷移到添加列name到該表,後來我創建另一個遷移,增加了另一場address並添加索引到address領域。

當我運行遷移現在,它會更改表3次:添加name,添加address並添加索引。並且在每次執行時,alter table命令實際上都會創建一個新表,將所有數據複製到它並刪除舊錶。

在我的情況下,members表很大,超過10M條記錄,所以每個修改需要幾個小時。

有沒有辦法將變更合併爲一個變更?

回答

2

您的問題有點難以理解,因爲您不僅限於每次遷移一次操作。

,你可以很容易做到:

class AddNameAddressAndIndexToMembers < ActiveRecord::Migration 
    def up 
    change_table :members do |t| 
     t.string :name 
     t.text :address 
     t.index :name 
    end 
    end 

    def down 
    change_table :members do |t| 
     t.remove_index :name 
     t.remove :name, :address 
    end 
    end 
end 

只是扭轉你的遷移,刪除以前遷移文件,運行這個遷移和所有應該很好。

現在,如果您的意思是這些舊遷移,可能會非常棘手,因爲您不想扭轉大量的遷移。但是你想實現什麼?如果您只需要部署,請使用rake db:schema:dump and rake db:schema:load

1

如果您真的想要最大化速度,那麼您可能應該考慮在執行調用中部署SQL,您可以在其中創建一個臨時結果集您期望的結構,空,滴,和/或改變現有的表,然後從臨時結果集重新填充該表:

class SQLRevisions < ActiveRecord::Migration 
    def change 
     execute " 
      [SQL PROCESS CALL] 
      [SQL PROCESS CALL] 
      [ETC.]" 
     end 
    end 

測試遷移本地的預期結果,然後再運行它你生產實例。