2011-11-23 123 views
7

我剛剛開始使用Ruby和Rails,而且我發現自己真正享受的其中一件事是它使您使用的約定。rake db :: migrate如何實際工作

我想在我自己的非Ruby項目中模仿該行爲。

我的問題是它是如何工作的?我知道我可以查看Rails代碼,但是我的理解還不夠深入,無法知道其中發生了什麼。

我知道它需要一個基線腳本,然後對它運行更新模式更改。但是它如何知道它的版本?我會如何模仿另一個框架/數據庫?

+1

它看起來是什麼最後一次遷移。它運行那些後來的。 *非常廣泛地說,它是一個用於編寫SQL的DSL(3.1中的可逆SQL)。你可以說得更詳細點嗎? –

+0

它在很多方面起作用......它的特定方面避開了你? –

+0

更新了問題。我正在專門討論遷移和拆卸(即耙子遷移回滾)。 – Dan

回答

21

注意:至於Rails 2.x,這是真的。它可能不適用於Rails 3,因爲我沒有像Rails 3那樣花費太多時間。

Rails創建一個名爲schema_migrations的特殊隱藏表。該表具有名爲version的單個列。此列中的每一行都有一行。該值是與遷移文件名時間戳匹配的時間戳。

當您遷移時,它會按照時間順序查看所有遷移(由於基於timstamp的命名約定,也會出現字母順序)。對於每次遷移,它都會在schema_migrations表中查找匹配的行。如果找不到一個,那麼它會運行該遷移,並添加該表的時間戳。如果確實找到了它,它就會假定它已經運行並簡單地跳過它。

結果是2位開發人員都可以以任何順序提交遷移,並且沒關係。這是因爲Rails確切知道哪些遷移已經運行,哪些沒有運行,無論您的數據庫第一次看到它們。

因此,要做到像這樣的事情,你只需要一種方法來永久存儲這個狀態,哪些步驟已被採取,哪些沒有。

+0

這正是我所期待的。謝謝一堆。 – Dan

+0

在這種情況下schema.rb的相關性是什麼?我將所有遷移與數據庫列匹配,我將無法使用schema.rb? –

+0

這就像一個photoshop文件。遷移是圖層和schema.rb是所有圖層合併的最終展平結果。因此,如果您只需將模式加載到測試數據庫中,則可以快速執行此操作,而不是按順序運行數百次遷移以獲得相同的結果。 –