就是一個紀錄「資料庫的架構」的檔案,我們可以知道目前資料庫的欄位有什麼?、型態是什麼?,也可以知道目前修改的紀錄與過程。可以跟著 git 一起把資料庫架構變更的進行版本控制。
利用之前 article 的例子來看,先產生一個 article 的 modelrails g model Article title content:text
會長出下面的 migration 紀錄
class CreateArticles < ActiveRecord::Migration[6.1]
def change
create_table :articles do |t|
t.string :title
t.text :content
t.timestamps
end
end
end
看到有 title 及 content 資訊,還有先前文章提到 id (不會顯示) 及 timestamps。
這邊只是先將資料表的內容描述好,需要進行 rails db:migrate
這個指令之後才可以把相關的資料表具象化,你可以想像成rails幫我們依照migration去做出對應的資料表。
前面提到具象化後我們的資料表就會依照 migration 去產生,但如果我們發現有些欄位需要調整應該怎麼辦?
像是我們如果要把上面再加入一個欄位叫做 tag 並且為 string 的類型。
我們可以先進行 rails db:rollback
將具現化的資料表退回還沒具現化的狀態,就可以進行修改
修改的方式:
建議使用第2種,因為如果多人協作,這樣在進行 git 版控的時候就會把新增的 migration 一起同步,其他人也不用 rollback 再 migrate,也可以避免原本檔案修改的時候動到其他資料。
新增一個 migration,通常命名會是 add_column_to_model 這樣的格式,你可以自己命名。rails g migration add_tag_to_article
class AddTagToArticle < ActiveRecord::Migration[6.1]
def change
add_column :articles, :tag, :string
# table 名, 欄位, 格式
end
end
如果要全部自動產生也可以,可以像這樣輸入,會產生跟上面一樣的效果,但有時候比較細部的調整還是會自己手動。rails g migration add_tag_to_articles tag:string
也可以進行移除,類似上面的格式,但前面改成,remove_column
class AddTagToArticle < ActiveRecord::Migration[6.1]
def change
remove_column :articles, :content, :text
# table 名, 欄位, 格式
end
end
之後記得再進行一次 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
還沒具象化。
可以用這邊檢視目前哪些檔案還沒具象化
rails db:migrate:status
Running via Spring preloader in process 30265
database: db/development.sqlite3
Status Migration ID Migration Name
--------------------------------------------------
up 20221002055926 Create stores
up 20221002153623 Create articles
down 20221005091102 Add tag to article
參考資料: