[Rails] Active Record Migration

資料來(lái)源:Rails Guide

Guide

-使用 generator 自動(dòng)生成遷移
-使用遷移創(chuàng)建,更改數(shù)據(jù)庫(kù)模式
-使用任務(wù)執(zhí)行遷移旨巷,完成數(shù)據(jù)庫(kù)模式更新
-在 schema.rb 文件中查看更新后的模式

1. Definition

Migration 以一種簡(jiǎn)單的方式來(lái)不斷更新你的數(shù)據(jù)庫(kù)模式 (database schema)。它使用 ruby DSL 所以你不必去寫那些繁瑣的數(shù)據(jù)庫(kù)SQL語(yǔ)句來(lái)更新模式脓诡,并且它是獨(dú)立于某種特定的數(shù)據(jù)庫(kù) (database independent)霍比,使用它可以作用于多個(gè)不同的數(shù)據(jù)庫(kù),當(dāng)你想要換數(shù)據(jù)庫(kù)時(shí)會(huì)顯得特別方便瘪松。你可以把每個(gè)數(shù)據(jù)庫(kù)遷移想象為一個(gè)數(shù)據(jù)庫(kù)版本咸作,schema 從什么都沒(méi)有開始一點(diǎn)點(diǎn)地隨著每個(gè)版本向前更新。你可以創(chuàng)建刪除表格宵睦,添加修改列名及其屬性记罚,添加索引等等復(fù)雜的操作。Active Record 會(huì)更新你的db/schema.rb文件來(lái)匹配你最新的數(shù)據(jù)庫(kù)結(jié)構(gòu)壳嚎。
–(1) 按照時(shí)間順序管理數(shù)據(jù)庫(kù)模式;
–(2) 對(duì)數(shù)據(jù)庫(kù)的操作和所用的數(shù)據(jù)庫(kù)種類無(wú)關(guān);
–(3) 可以把每次遷移看做是數(shù)據(jù)庫(kù)的一個(gè)修訂版本.

2. Create Migration

通過(guò) generator 生成遷移時(shí)遵循名字add_xxx_to_yyy, remove_xxx_from_yyy桐智,隨后跟著屬性和相匹配的類型 (默認(rèn)為字符串類型) (可以在類型后在指定是否要添加索引),會(huì)在遷移中自動(dòng)生成add_column, remove_column語(yǔ)句烟馅。同理说庭,使用create_xxx跟著屬性列表會(huì)自動(dòng)生成create_table(屬性列表若包含類型為references, belongs_to會(huì)生成加索引的關(guān)聯(lián),并在數(shù)據(jù)庫(kù)層添加完整性驗(yàn)證)郑趁。
Tips: 特殊詞: limit, precision, scale, polymorphic, null, default, index, comment

# migration generator examples
rails generate migration add_part_number_to_products part_number:string:index
rails generate migration add_details_to_products part_number:string price:decimal
rails generate migration create_products name:string part_number:string
rails generate migration add_user_ref_to_products user:references
rails generate migration create_join_table_customer_product customer product
rails generate migration add_details_to_products 'price:decimal{5,2}' supplier:references{polymorphic}

3. Running Migration

通過(guò)使用rake db:migrate / rake db:rollback來(lái)進(jìn)行更新或回滾操作刊驴。
運(yùn)行rake db:migrate任務(wù)時(shí),會(huì)生成調(diào)用遷移中的changeup方法,隨后運(yùn)行rake db:schema:dump捆憎,更新與你數(shù)據(jù)庫(kù)結(jié)構(gòu)相匹配的db/schema.rb文件舅柜。
– 針對(duì)那些無(wú)法自動(dòng)回滾的操作,我們可以使用 reversible 或者 up/down方法
– 若想修改已經(jīng)運(yùn)行的遷移躲惰,要先回滾到之前的狀態(tài)致份,做修改,再運(yùn)行遷移
– 若想運(yùn)行指定版本的遷移(破壞順序) rake db:migrate:up VERSION=20080906120000
– 指定目標(biāo)版本會(huì)(跟新/回滾)到那個(gè)版本 rake db:migrate VERSION=20080906120000
– 若想回滾到最初版本則將目標(biāo)版本設(shè)為零即可 rake db:migrate VERSION=0
– 若想回滾指定次數(shù)的遷移則通過(guò)設(shè)置STEP來(lái)達(dá)到 rake db:migrate STEP=4
– 若想回滾之后重新運(yùn)行指定次數(shù)的遷移 rake db:migrate:redo STEP=3
rake db:setup 用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)础拨,導(dǎo)入數(shù)據(jù)庫(kù)模式知举,初始化種子數(shù)據(jù)
rake db:reset 用來(lái)刪除原先數(shù)據(jù)庫(kù),再重新創(chuàng)建配置 drop then setup
rake db:reset 注意是通過(guò)導(dǎo)入模式文件而不是重新運(yùn)行遷移
rake db:schema:dump => db/schema.rb 匹配自動(dòng)生成新的數(shù)據(jù)庫(kù)模式
rake db:structure:dump => db/structure.sql 生成SQL語(yǔ)句的結(jié)構(gòu)模式

Migration for MySQL Limit

# ActiveRecord Migrate
create_table 'example' do |t| 
  t.integer :int  # int (4 bytes, max 2,147,483,647) 
  t.integer :int, :limit => 1  # tinyint (1 byte, -128 to 127) 
  t.integer :int, :limit => 2  # smallint (2 bytes, max 32,767) 
  t.integer :int, :limit => 3  # mediumint (3 bytes, max 8,388,607)     
  t.integer :int, :limit => 4  # int (4 bytes) 
  t.integer :int, :limit => 5  # bigint (8 bytes, max 9,223,372,036,854,775,807) 
  t.integer :int, :limit => 8  # bigint (8 bytes) 
  t.integer :int, :limit => 11 # int (4 bytes)
end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末太伊,一起剝皮案震驚了整個(gè)濱河市雇锡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌僚焦,老刑警劉巖锰提,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芳悲,居然都是意外死亡立肘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門名扛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谅年,“玉大人,你說(shuō)我怎么就攤上這事肮韧∪邗澹” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵弄企,是天一觀的道長(zhǎng)超燃。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拘领,這世上最難降的妖魔是什么意乓? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮约素,結(jié)果婚禮上届良,老公的妹妹穿的比我還像新娘。我一直安慰自己圣猎,他們只是感情好士葫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著样漆,像睡著了一般为障。 火紅的嫁衣襯著肌膚如雪晦闰。 梳的紋絲不亂的頭發(fā)上放祟,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天鳍怨,我揣著相機(jī)與錄音,去河邊找鬼跪妥。 笑死鞋喇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眉撵。 我是一名探鬼主播侦香,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纽疟!你這毒婦竟也來(lái)了罐韩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤污朽,失蹤者是張志新(化名)和其女友劉穎散吵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蟆肆,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矾睦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炎功。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枚冗。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛇损,靈堂內(nèi)的尸體忽然破棺而出赁温,到底是詐尸還是另有隱情,我是刑警寧澤淤齐,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布束世,位于F島的核電站,受9級(jí)特大地震影響床玻,放射性物質(zhì)發(fā)生泄漏毁涉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一锈死、第九天 我趴在偏房一處隱蔽的房頂上張望贫堰。 院中可真熱鬧,春花似錦待牵、人聲如沸其屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)偎行。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛤袒,已是汗流浹背熄云。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妙真,地道東北人缴允。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像珍德,于是被迫代替她去往敵國(guó)和親练般。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容