[059]Ruby on Rails學習筆記(9)-Active Record遷移

前言:

遷移是一種管理資料庫的方式,遷移使用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

你可能感兴趣的