優秀程式設計師除撰寫代碼,亦需創建管理大量資料庫。過往使用 phpMyAdmin、MySQL client 等工具雖好用,但總感編程與資料庫管理間存在鴻溝。為何不以編程方式管理資料庫結構?Rails 提供了答案:透過其功能,程式設計師可用熟悉的方式管理 MySQL。
Rails 中創建 contact model 時,同步創建 contacts 資料表。操作資料表轉化為操作模型屬性。核心功能 Migrations(遷移) 讓開發者用 Ruby 管理資料庫結構,結合 Rake 依腳本指令更新資料庫,內建版本控制,可像 Subversion/CVS 般回滾變更。
Migrations 類似 Active Record,語法簡單,支援創建、修改、刪除資料表,並提供建構控制器。創建 model 時自動生成遷移檔(如 db/migrate/001_create_contacts.rb):
class CreateContacts < ActiveRecord::Migration
def self.up
create_table :contacts do |t|
end
end
def self.down
drop_table :contacts
end
end
修改後執行 rake db:migrate 即創建資料表。回滾至版本 0:rake db:migrate VERSION=0,資料表隨之刪除。複雜操作(新增資料表、修改欄位型別)只需生成新遷移檔:ruby script/generate migration your_desired_migration_name。
專案初期常需導入現成資料(如州名稱單選選單)。手工建表繁瑣且易錯。Fixtures 原為測試簡化示例資料轉換而設計,稍加改造即可用於遷移期間載入資料。格式支援 YAML 與 CSV。
範例:建立 db/seed/state.csv:
id, name, abbreviation
1, Alabama, AL
2, Alaska, AK
...
創建 lib/tasks/seeder.rake:
namespace :db do
desc "Load seed fixtures (from db/seed) into the current environment's database."
task :seed => :environment do
require 'active_record/fixtures'
Dir.glob(RAILS_ROOT + '/db/fixtures/*.csv').each do |file|
Fixtures.create_fixtures('db/seed', File.basename(file, '.*'))
end
end
end
執行 rake db:seed 即生成資料表並導入資料。
Rails 開發者 Tobias Lutke 以 Rake 任務將資料導出為 YAML,再透 Migrations 導入其他資料庫(MySQL、SQLite、SQL Server、Oracle)。關鍵命令:
# 導出
rake db:backup:write
# 修改 database.yml 指向目標資料庫
# 導入
rake db:backup:load
Rake 不僅能跑測試、跑遷移,更可編寫自訂任務、建立專屬 Rake 庫。本文僅窺冰山一角,Rails 支援主流資料庫。深入探索請參閱 官方 Migrations 文檔。