[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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容