2012-10-23 39 views
0

我已經運行了幾次長時間的遷移。就像我有代碼的某些部分更新了很多記錄並從幾分鐘到幾小時一樣運行。Rails:取消(ctrl + c)長時間運行遷移時會發生什麼?

我從來沒有試圖取消(ctrl + c)的遷移,因爲我不知道該遷移會發生什麼。它會知道遷移被取消了嗎?該遷移和我的應用會發生什麼?如果取消後會發生什麼,我運行rake db:再次遷移?

我的一個腳本看起來是這樣的:

def up 
    add_column :foo, :bar, :string 

    Foo.all.each do |f| 
    f.bar = if f.x 
     'foo' 
    else 
     'bar' 
    end 

    f.save 
    end 

    remove_column :foo, :something 
end 

def down 
    * reverse of up 
end 

我使用Postgres的爲好。

回答

0

這取決於您使用的數據庫。如果數據庫支持定義更改,則Rails會在遷移周圍使用事務。據我所知,PostgreSQL做到了這一點,而MySQL(至少MyISAM表)沒有(但可能已經改變)。

因此,如果您運行PostgreSQL,它應該取消事務,並且應該可以簡單地再次運行它並獲得乾淨的結果(儘管我會測試這一點,但事務可能會非常棘手,具體取決於更新的複雜性你做)。 MySQL會被部分更新的記錄卡住,或者遷移表中的版本計數器可能不會被更新,並且爲了再次運行它,它會嘗試再次創建新的字段並失敗並返回錯誤。

+0

Hrmn ...因爲現在,我又遇到了這個問題。上面提到的腳本(編輯擴展更新部分),當我檢查psql時,我可以看到我的一些記錄已經更新。這是否意味着如果我取消它,它不會退回所有這些記錄? – index

+0

我從來沒有嘗試過這個,所以我不能肯定地說。它應該,如果交易像他們應該回滾。但是獨立於實際的實現,我不確定一個ctrl-c是否會制動整個事件並阻止回滾。在這種情況下,您將不得不手動回滾一些數據庫工具。可能會變得棘手。 –

+0

你知道實際情況,當我提到我上面的「更新」評論時,我想我做錯了什麼。我再次檢查了正確的查詢,我認爲它沒有真正運行。所以我取消了,編輯了更新(將它移動到別的地方)並再次運行遷移,它確實運行了這個特定的遷移,所以我想它已經回滾了,或者它沒有爲該遷移事務運行提交。謝謝! – index

相關問題