Migration, so far

今までやったmigrationのまとめ。

Migrationはデータベースの変更を管理する機能。通常SQL文を書いて/db/hogehoge.sqlとかに保存して、データベースを操作したりするところを、抽象化したデータベースの命令を使って記述することによって、MySQLとかPostgreSQLなどの違いを気にせず、スキーマの管理ができます。現在対応しているDBMSMySQL, PostgreSQL, SQLite, SQL Server, Oracleだそうです。
使用するデータベースは/config/database.ymlで設定されたものになります。

Migrationを使う手順

% ruby script/generate migration MigrationName

で、/db/migrate/以下にXXX_migration_name.rb(XXXは001から始まる番号)というファイルが生成されます。ここにテーブル生成等の命令を書いていきます。ここでは、migrationの名前をMigrationNameとしましたが、名前にハイフンがあるとrakeする段階でエラーを吐くので注意。
次に、生成したXXX_migration_name.rbに、スキーマ変更命令を書いた後に、

% rake migrate

スキーマの変更が実行されます。
ここで知っておきたいのが、名前の一致不一致に関わらず、generate migrationを実行するたびに生成されるファイル名のプレフィックスに、通し番号で3桁の数字がつくということ。つまり、バージョン管理は番号だけで行われて、名前はバージョン管理に使われていないっぽいです。スキーマ変更の内容が分かりやすいmigrationの名前を付けるのが吉でしょう。
例:

% ruby script/generate migration CreateZenigataFamilyMembersTable
% ruby script/generate migration CreateKetaiDekaDramasTable
% ruby script/generate migration FixZenigataFamilyTable

データベースを最新のバージョンにするときは

% rake migrate

でいいようですが、昔のバージョンに戻したいときは

% rake migrate VERSION=3

とかで好きなバージョンに戻すことができます。

バージョン管理機能

migrationをgenerateするたびに、XXX_migration_name.rb

Migrationのスキーマ変更命令

生成したての001_migration_name.rbは次のような内容になっています。

[]class[] MigrationName < []ActiveRecord[][]::Migration[]
  def self.up
  []end[]

  def self.down
  []end[]
[]end[]

upメソッドには、通常はテーブルを生成したり、カラムを追加したりする命令を記述します。
逆に、downメソッドには、通常はテーブルを削除したりカラムを削除したりする命令を記述します。
rake migrateでデータベースを変更するときに、バージョンが上がるときにはupにあるスキーマ変更メソッドが実行され、バージョンが下がるときにはdownにあるスキーマ変更命令が実行されます。つまり、upにあるメソッドと、downにあるメソッドは殆どの場合において対応関係(createとdrop、addとremove等)にないと、バージョンの上げ下げをしているうちにデータベースに不整合が生じてしまいます。気をつけましょう。
では、代表的なスキーマ変更命令をみていきましょうか。

  • add_column(table_name, column_name, type, options = {})

カラムを追加する命令です。self.upの定義の中とかで使いましょう。
例:

add_column :ketai_deka_dramas, :off_record, :string, :limit => 100

この命令で、:ketai_deka_dramasテーブルに、:off_recordという名前のカラムが、型varchar(100)で追加されます。
型は、抽象化された型を使っていて、それぞれMySQLPostgreSQLの対応する型が自動的に選択されてテーブルに追加されます。便利便利。
オプションには、:limit, :null, :defaultが指定できます。:limitを指定すると、たとえば:stringがMySQLに適応される場合、varchar(*)の*の部分を指定することができます。
:nullは:null => true/false とすることで、nullを許す/許さないを決めます。
デフォルトでは許すっぽいです。
:defaultでは、そのカラムのデフォルト値を指定できます。

  • create_table(name, options = {}) {|table_definition| ...}

テーブルを生成する命令です。説明するより使用例を見たほうが早いです。

self.up
  create_table(:zenigata_family_members, :options => "default charset=utf8"){|t|
    t.column :name, :string, :null => false
    t.column :actress, :string, :null => false
  }
end

Railsの規約では、データベースにidカラムがプライマリキーであることが自然なので、明記しないでも自動でidカラムは作成されます。
t.columnで各カラムの定義を行います。t.columnの後ろはadd_columnと同じです。
:zenigata_familiesがテーブル名です。次に、:options => "..."は指定できるオプションの一つで、SQL文で言うと、テーブル定義の{}の直後にくっつく命令文ですね。セミコロンはいらないようです。オプションには他にも:id, :primary_key, :temporary, :forceが指定できます。
:id => true/false で、プライマリキーのidカラムを追加する/しないを指定できます。
:primary_key => "カラム名" で、プライマリキーをすきなカラムに指定できます。
:temporary => true/false で、テンポラリテーブルが作成できます。テンポラリテーブルってのは、今回のSQLの接続が終わったら消えてしまうテーブルのことらしいです。用途不明(´・ω・`)
:force => true/false で、すでに同じ名前のテーブルがあるときに、そのテーブルを削除する/しないを指定できます。

まんまです。テーブルを削除します。

  • remove_column(table_name, column_name)

まんまです。カラムを削除します。

さあみんなも快適migration life!!

参考:
ヽ( ・∀・)ノくまくまー
Ruby on Rails API Documents