db:migrate 的用途
在多個環境或多人開發的時候,我們會頻繁的使用
db:migrate
,為得是將各個環境的資料庫結構給同步起來,而不用使用同一個資料庫來開發。使用同一個資料庫除了會弄髒彼此的還境外,也會造成每改一次資料庫,就要確認其他開發者的程式碼是 workable 的,也就是「schema和程式碼不同步」的情形。在這樣的情形下,將 migration 寫成腳本並加上 time stamp ,在各自環境的資料庫各自進行 migration 就成了一個最合理的 solution 了。而因為 migration 腳本就是整個專案程式碼的一部分,也就解決了schema 及程式碼的同步問題。每個開發者可以依照自己的進度 commit、pull、merge,再執行
rake db:migrate
,資料庫就同步了。但是在開發過程,尤其是初期的 scratch 階段,常常會有一堆冗餘的動作,例如:
- 創建 users 資料表
- 加兩個欄位到 users 資料表
- 刪除 users 的其中一個欄位
- 再加一個欄位到 users 資料表
這時就會在系統中留下四個針對 users 資料表的 migration 腳本。這時如果有一個新加入的開發者,將程式碼拉到自己建立的新環境,使用
rake db:migrate
這個指令後, rake 就會乖乖的幫你分四個步驟做完,其實很沒必要也很笨。db:schema:load 幫你直接從 schema.rb 初始化資料庫結構
其實在你進行migration的時候,rake 也產出了一份資料庫的架構檔案,叫做「schema.rb」,這個檔案記錄了這個專案的資料庫目前的架構。檔案中也會有一個 timestamp 記錄這是什麼時候的結構,用以區分先後順序。
而當有新的環境要被建立,或是重置資料庫的時候,我們可以利用
rake db:shema:load
這個指令讓資料庫「一步到位」,而不用一步步的照 migration 腳本來設置資料庫。