migration 資料 copy from internet

[code]
migration好像是rails 1.0出的功能,到底它是什麼什麼東東?用來幹嗎的?且聽下面分解.

migration是一種分佈環境下的數據庫同步功能,它提供了: 1.獨立於特定SQL的schema描述(當然是用ruby DSL啦).目前除了DB2外別的主流商用和開源數據庫都被支持.(IBM真衰).顯然,這種數據庫獨立的schema描述不可能包括數據庫特定的細節, 所以在生產環境中需要再行調試優化. 2.schema和數據內容版本控制.我不是DBA啊(雖然曾經想過幹這個),不知道有什麼別的工具可以做數據庫版本控制. 3.基於版本控制的分佈式數據庫同步.

先來說說基於ruby DSL的schema描述巴,打打基礎. 如果rails項目中的數據庫已經設計配置好了,可以執行rake db:schema:dump(這是Rails1.1的rake新語法,以前是rake db_schema_dump) 然後會生成db/schema.rb文件.打開一看,基本結構類似這樣的:



ActiveRecord::Schema.define(:version => 5) do

create_table "choices",:id => false, :force => true do |t|

t.column "name", :string,, :limit => 30, :default => 'idiolt'

t.column "content", :text, :limit => 100

t.column "question_id", :integer, :null => false

end

...

:version以後用了migrate纔會看見,現在應該是空的,先不管這個. 如你所見這個表定義非常直觀.需要說明的幾個選項.

:force代表強制覆蓋,默認false後面執行db:schema:load把表結構導回數據庫的時候如果表已經存在由這個選項決定是否覆蓋. :id參數默認爲true,也就是按照rails約定每個表自動建立id字段作爲主鍵.false的話意思是你自己在schema中建立主鍵. :limit和:default不用解釋了吧. :null也沒啥好解釋的,false代表着SQL裏的NOT NULL

你們已經看到db:schema:load了,恭喜,現在哪怕你不關心版本控制和分佈式同步這些 "遙遠的事". 你也可以從容在各種不同數據庫直接移植表結構了.這可是DBA都頭疼的事呢. 只要改一下database.yml的配置再執行rake db:schema:load就可以了.

現在來說說版本控制和同步.數據庫畢竟不是代碼,除了schema外還有數據的.像上面這樣 load導進去的話會覆蓋掉所有的數據. 所以我們需要找一個對數據影響最小的方法來更新數據庫. 這部分需要做些手工操作了: script/generate migration XXX 建立一個migration版本,這個操作會在db/migration下產生nnn_XXX.rb文件. 同時 generate model的時候也會順帶產生nnn_create_XXX.rb文件. 內容類似:



class CreatePortfolios < ActiveRecord::Migration

def self.up

create_table :portfolios do |t|

t.column :name, :string

end

end

def self.down

drop_table :portfolios

end

end

up方法定義這個版本該做什麼,down定義怎麼回滾版本. 這裏up裏面創建了一個表, 方法和上面schema.rb裏的一樣. 除此外更常用的是對字段和索引的修改方法, 如 add_column/rename_column/change_column等,詳見api文檔. 除了對錶結構的修改,還可以做任何對數據的修改. 比如導入數據常用的先刪掉index,然後再導入, 最後再重建index.

定義好了migration後,我們可以執行rake db:migrate更新到最高的版本,或者指定回滾到某個版本: rake db:migrate version=n. migration自動根據當前版本判定該從哪回滾到哪. 在分佈環境下,同步代碼後只要執行一下就能保證數據庫狀態也是最新版本.

engine/plugin也能使用migration,比如login engine,在不破壞用戶已有數據庫內容的條件下添加新的所需數據內容.

另外需要注意的是每次使用migration後,db/schema.rb都會被刷新,所有手工對這個文件的修改都會丟失.

migration默認是不支持外鍵的,原因是一部分數據庫如MySQL ISAM和SQLite不支持外鍵,同時外鍵也會給Rails的test fixture導入數據造成麻煩(這個好像有個很麻煩的解決辦法)。不過還是有個插件提供了外鍵的導出(rake db:schema:dump)和導入(rake db:schema:load)(可惜migration中無法正常使用)。

[/code]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章