iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Modern Web

一探紅寶石的神秘面紗 - Ruby 及 Rails入門介紹 系列系列 第 21

Day 21 - 進入Rails世界必須懂:Migration

  • 分享至 

  • xImage
  •  

Migration 是什麼

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

建立 Migration

利用之前 article 的例子來看,先產生一個 article 的 model
rails 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

前面提到具象化後我們的資料表就會依照 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

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

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 還沒具象化。
可以用這邊檢視目前哪些檔案還沒具象化

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

上一篇
Day 20 - 進入Rails世界必須懂:Model 相關介紹 及 CRUD (下)
下一篇
Day 22 - 進入Rails世界必須懂:Model 關聯性 (1:1)
系列文
一探紅寶石的神秘面紗 - Ruby 及 Rails入門介紹 系列30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言