進入Rails世界必須懂:Migration
Migration 是什麼
就是一個紀錄「資料庫的架構」的檔案,我們可以知道目前資料庫的欄位有什麼?、型態是什麼?,也可以知道目前修改的紀錄與過程。可以跟著 git 一起把資料庫架構變更的進行版本控制。
建立 Migration
利用之前 article 的例子來看,先產生一個 article 的 modelrails g model Article title content:text
會長出下面的 migration 紀錄
1 | class CreateArticles < ActiveRecord::Migration[6.1] |
看到有 title 及 content 資訊,還有先前文章提到 id (不會顯示) 及 timestamps。
這邊只是先將資料表的內容描述好,需要進行 rails db:migrate
這個指令之後才可以把相關的資料表具象化,你可以想像成 rails 幫我們依照 migration 去做出對應的資料表。
修改 Migration
前面提到具象化後我們的資料表就會依照 migration 去產生,但如果我們發現有些欄位需要調整應該怎麼辦?
像是我們如果要把上面再加入一個欄位叫做 tag 並且為 string 的類型。
我們可以先進行 rails db:rollback
將具現化的資料表退回還沒具現化的狀態,就可以進行修改
修改的方式:
- 直接修改原本 migration
- 再新增一個新的 migration
建議使用第 2 種,因為如果多人協作,這樣在進行 git 版控的時候就會把新增的 migration 一起同步,其他人也不用 rollback 再 migrate,也可以避免原本檔案修改的時候動到其他資料。
新增 column
新增一個 migration,通常命名會是 add_column_to_model 這樣的格式,你可以自己命名。rails g migration add_tag_to_article
1 | class AddTagToArticle < ActiveRecord::Migration[6.1] |
如果要全部自動產生也可以,可以像這樣輸入,會產生跟上面一樣的效果,但有時候比較細部的調整還是會自己手動。rails g migration add_tag_to_articles tag:string
移除 column
也可以進行移除,類似上面的格式,但前面改成,remove_column
1 | class AddTagToArticle < ActiveRecord::Migration[6.1] |
之後記得再進行一次 migration。
如果沒寫好就進行 migration?
不會怎麼樣,就執行了一個空的 Migration,可能就會看到 Migration 檔案裡就有寫這些欄位,但 schema.rb 檔案裡卻沒有的情況。可以在 rollback 回去重新調整在進行一次 migrate。
一些常用的相關指令
新增
rails g migration ...
刪除
rails d migration ...
把整個資料庫內容移除 (所有建立好的資料都會移除)
rails db:drop
重新建立資料庫
rails db:create
檢查所有 migration 狀況
rails db:migrate:status
可以看到下面這樣得狀態顯示,up
表示已經 migrate 過的檔案,down
還沒具象化。
可以用這邊檢視目前哪些檔案還沒具象化
1 | rails db:migrate:status |
參考資料: