身為開發者,頻繁建立管理 MySQL 資料庫是常態。傳統工具如 phpMyAdmin、MySQL CLI 雖好用,但總感覺與程式開發流程脫節。Rails 提供 Migrations 機制,讓開發者以 Ruby 程式碼版控資料庫結構,配合 Rake 任務自動化執行,實現「基礎設施即程式碼」理念。
建立 Model 時自動產生 Migration 檔(如 db/migrate/001_create_contacts.rb),使用 Ruby DSL 定義資料表操作:
class CreateContacts < ActiveRecord::Migration
def self.up
create_table :contacts do |t|
t.column :name, :string, :null => false
t.column :email, :string
t.column :phone, :string, :limit => 10, :null => false
end
end
def self.down
drop_table :contacts
end
end
執行 rake db:migrate 套用變更,rake db:migrate VERSION=0 回滾至初始狀態。內建版控機制支援如 Subversion/CVS 般的前後回滾。
需修改結構時,產生新遷移檔:
ruby script/generate migration your_desired_migration_name
編輯檔案定義 self.up/self.down 對應操作,再執行 migrate 套用。
如「州名」下拉選單,手工建表易出錯且繁瑣。Fixtures 原為測試資料設計,採 YAML 或 CSV 格式,亦可用於遷移期載入種子資料。
db/seed/states.csv:id, name, abbreviation 1, Alabama, AL 2, Alaska, AK 3, Arizona, AZ ...
lib/tasks/seeder.rake:namespace :db do
desc "Load seed fixtures from db/seed into current environment's database"
task :seed => :environment do
require 'active_record/fixtures'
Dir.glob(RAILS_ROOT + '/db/seed/*.csv').each do |file|
Fixtures.create_fixtures('db/seed', File.basename(file, '.*'))
end
end
end
rake db:seed 匯入資料,MySQL 驗證表已建立且資料寫入。Rails 核心團隊 Tobias Lutke 實踐:以 Rake 任務將資料庫匯出為 YAML,再透 Migrations 導入目標資料庫(支援 MySQL、SQLite、SQL Server、Oracle)。關鍵指令:
rake db:backup:write # 匯出為 YAML 至 db/backup/ # 修改 database.yml 指向目標資料庫 rake db:backup:write # 匯入目標庫
Rails 不僅支援 MySQL,涵蓋主流資料庫。深入理解 Rake 任務運作,可撰寫專屬自動化腳本、建立可重用 Rake 函式庫。詳見 Rails 官方 Migrations 文件:ActiveRecord::Migration API。