前言:
遷移是一種管理資料庫的方式,遷移使用Ruby DSL而非用手寫SQL,不僅增加效率、也方便管理,
每筆資料的遷移都可以想成資料庫的新版本,資料庫一開始什麼都沒有,但隨著把每筆資料遷移進去,執行刪除、增加、修改等紀錄,此外,active record也能隨著增料庫的建立時間,依照時間順序更新,甚至在更新資料庫時,也會修改db/schema.rb,與資料庫同步更新。
以下分為四大點來介紹遷移的概念:(括號後為關鍵字)
一、使用遷移的產生器:(model,scaffold)
二、Active Record提供用來操作資料庫的方法(add,remove,change欄位、資料表)
三、撰寫Rake任務來管理資料庫綱要與遷移檔案(rake db:xxx語法)
四、遷移與db/schema.rb的關係(schema.rb與migration是同步的)
一、概覽
在建立遷移的檔案中介紹,在db/migrate中增加一筆YYYYMMDDHHMMSS_create_products.rb,上述的檔案會定義出CreateProducts這樣的類別名稱,
當初的輸入指令
$ rails generate migration CreateProducts
假使想再增加欄位,那就是
$rails generate migration CreateProducts product_name:string
換句話說,product就像是此表格的名稱,而product_name就是資料的名字
另外,也可以移除某個欄位,其中的語法為
$rails generate migration RemovePartNumberFromProducts part_number:string
結果
class RemovePartNumberFromProducts < ActiveRecord::Migration
def change
remove_column:products, :part_number, :string
end
end
還有一種欄位類型叫做belong_to=rederence
再[053]Ruby on Rails學習筆記(5) -Add second model提到,
$ rails generate model Comment commenter:string body:text article:references
關鍵在於,“article:references”,把model Article 與 model Comment做關聯,
因此會在model/comment.rb也會看到“belongs_to:article”,
甚至在資料庫中還看到這行:t.references:article, index:true
二、建立遷移
接著談到model的產生器與傳入類型的修飾符,像是
$ rails generate migration AddDetailsToProducts 'price:decimal{5,2}'
意味
add_column:products,:price,:decimal, precision:5, scale:2
scale小數點後兩位,precision包括小數點,全部位數要是5位以內
三、撰寫遷移
建立資料表,像是rails g model 或者 rails g scaffold,
然後去修改資料表、修改欄位、修改欄位的修飾符、外鍵、使用reversible、取消之遷移的revert,
建立:建立資料表的 SQL 語句,附上ENGINE=BLACKHOLE
(使用 MySQL 預設是ENGINE=InnoDB)。
修改資料表:
change_table:productsdo|t|
t.remove:description,:name
t.string:part_number
t.index:part_number
t.rename:upccode,:upc_code
end
會移除description與name欄位。新增part_number(字串)欄位,並打上索引。
並將upccode欄位重新命名為upc_code。
修改欄位:change_column:products,:part_number,:text會更改資料表products裡的part_number欄位,類型改為text
欄位修飾符:像是precision,scale,index等等
外鍵:
雖然不是必須的,但可能會想加入外鍵約束來保證參照的完整性
add_foreign_key:articles,:authors
上例會給articles資料表新增外鍵欄位:author_id。外鍵會使用articles資料表的主鍵id作為參照。
使用reversible用法:
架構是
reversible do |dir|
dir.up do
end
dir.down do
end
end
up是負責資料庫綱要的變化
down是取消操作回滾
假使,你真的刪除了data,那他就是irreversible的 migration,
取消之前的遷移:revert
同樣的遷移也可以不用revert處理,但會需要多做幾個步驟。
把create_table與reversible順序對換,create_table換成drop_table,
最後對換updown裡的程式碼。其實這就是revert做的事。
四、執行遷移
$ rake db:roll back 回滾前一次的執行動作
$ rake db:migrate
rake db:setup會新建資料庫、載入資料庫綱要、並用種子資料來初始化資料庫
rake db:reset會將資料庫移除,再重新建立。等同於rake db:drop db:setup。(執行testfile時,測試成功)
總結:在學fu0