Migration, so far
今までやったmigrationのまとめ。
Migrationはデータベースの変更を管理する機能。通常SQL文を書いて/db/hogehoge.sqlとかに保存して、データベースを操作したりするところを、抽象化したデータベースの命令を使って記述することによって、MySQLとかPostgreSQLなどの違いを気にせず、スキーマの管理ができます。現在対応しているDBMSはMySQL, 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)で追加されます。
型は、抽象化された型を使っていて、それぞれMySQLやPostgreSQLの対応する型が自動的に選択されてテーブルに追加されます。便利便利。
オプションには、: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 で、すでに同じ名前のテーブルがあるときに、そのテーブルを削除する/しないを指定できます。
- drop_table(name)
まんまです。テーブルを削除します。
- remove_column(table_name, column_name)
まんまです。カラムを削除します。
さあみんなも快適migration life!!