Migration 是什麼

就是一個紀錄「資料庫的架構」的檔案,我們可以知道目前資料庫的欄位有什麼?、型態是什麼?,也可以知道目前修改的紀錄與過程。可以跟著 git 一起把資料庫架構變更的進行版本控制。

建立 Migration

利用之前 article 的例子來看,先產生一個 article 的 model
rails g model Article title content:text

會長出下面的 migration 紀錄

1
2
3
4
5
6
7
8
9
10
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

前面提到具象化後我們的資料表就會依照 migration 去產生,但如果我們發現有些欄位需要調整應該怎麼辦?
像是我們如果要把上面再加入一個欄位叫做 tag 並且為 string 的類型。

我們可以先進行 rails db:rollback 將具現化的資料表退回還沒具現化的狀態,就可以進行修改

修改的方式:

  1. 直接修改原本 migration
  2. 再新增一個新的 migration

建議使用第 2 種,因為如果多人協作,這樣在進行 git 版控的時候就會把新增的 migration 一起同步,其他人也不用 rollback 再 migrate,也可以避免原本檔案修改的時候動到其他資料。

新增 column

新增一個 migration,通常命名會是 add_column_to_model 這樣的格式,你可以自己命名。
rails g migration add_tag_to_article

1
2
3
4
5
6
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

移除 column

也可以進行移除,類似上面的格式,但前面改成,remove_column

1
2
3
4
5
6
7
class AddTagToArticle < ActiveRecord::Migration[6.1]
def change
remove_column :articles, :content, :text
# table 名, 欄位, 格式
end
end

之後記得再進行一次 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
2
3
4
5
6
7
8
9
10
11
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

參考資料:

  1. Rails Guide
  2. 為你自己學 Ruby on Rails