1. マイグレーション(3)
2012/09/24 シナジーマーケティング(株) 鈴木 圭
Model 1章 マイグレーション
- 1.1. マイグレーションとは
- 1.2. マイグレーションの作成と実行
- 1.3. マイグレーションファイルの名前
- 1.4. データ型
- 1.5. マイグレーション API
- 1.6. マイグレーションに関する Rake タスク
- 1.7. リバーシブル・マイグレーション
- 1.8. 特殊なカラム名
- 1.9. 初期データの登録
- 1.10. データ修正
1.6. マイグレーションに関する Rake タスク
「rake db:migrate」でマイグレーションが実行できることは既に述べました。
「rake db:migrate」以外にもマイグレーションに関する Rake タスクが提供されていますので、ここでまとめます。
(※正確には「db:migrate」が Rake タスクの名前ですが、ここでは分かりやすく「rake db:migrate」のように記述しています。)
タスク | 実行内容 |
---|---|
rake db:create | データベースを作成します。 |
rake db:drop | 作成したデータベースを削除します。 |
rake db:migrate | 未実行のマイグレーションを実行します。 |
rake db:migrate:up VERSION=YYYYMMDDHHMMSS | YYYYMMDDHHMMSS に指定したバージョンのマイグレーションを実行します。 指定したマイグレーションが実行済みの場合は何も行われません。 |
rake db:migrate:down VERSION=YYYYMMDDHHMMSS | YYYYMMDDHHMMSS に指定したバージョンのマイグレーションをロールバックします。 指定したマイグレーションが未実行の場合は何も行われません。 |
rake db:migrate:status | マイグレーションの状態を表示します。 未実行のマイグレーションを確認することができます。 |
rake db:rollback STEP=n | 実行済みのマイグレーションを n 段階ロールバックします。 STEP を省略した場合は STEP=1 として扱われます。 |
rake db:migrate:redo STEP=n | 実行済みのマイグレーションを n 段階ロールバック後、未実行のマイグレーションを実行します。 STEP を省略した場合は STEP=1 として扱われます。 |
rake db:seed | db/seeds.rb を実行し、初期データを登録します。 |
rake db:setup | データベースの作成、マイグレーションの実行、初期データの登録を行います。 「rake db:create」「rake db:migrate」「rake db:seed」を実行することと同じです。 |
rake db:reset | データベースを削除後、データベースの作成、マイグレーションの実行、初期データの登録を行います。 |
マイグレーションに関する Rake タスクはいくつもありますが、新しくプロジェクトを作成するときは以下の順番で進めることになるでしょう。
- conf/database.yml にデータベースの接続情報を記述し、「rake db:create」でデータベースを作成する。
- マイグレーションファイルを作成し、「rake db:migrate」でマイグレーションを実行する。
- db/seeds.rb に初期データを登録するコードを記述し、「rake db:seed」で初期データを登録する。
初期データの登録については後ほど解説します。
1.7. リバーシブル・マイグレーション
マイグレーションでは up/down メソッドを change メソッドにまとめることができます。
先ほどの users テーブルを作成するマイグレーションをもう一度見てみましょう。
class CreateUsers < ActiveRecord::Migration def up # ユーザ情報を保持する users テーブルを作成する. create_table :users do |table| # 名前. table.string :name, :null => false # メールアドレス. table.string :email, :null => false # 年齢. table.integer :age, :null => false # 登録日時, 更新日時. table.timestamps end end def down # users テーブルを削除する. drop_table :users end end
既に述べたとおり、up メソッドにはスキーマを変更する処理を記述し、down メソッドにはスキーマの変更を元に戻す処理を記述します。
いくつか例を挙げると、
- up メソッドでテーブルを作成した場合は down メソッドで作成したテーブルを削除する。
- up メソッドでカラムを追加した場合は down メソッドで追加したカラムを削除する。
- up メソッドでインデックスを作成した場合は down メソッドで作成したインデックスを削除する。
という具合に up メソッドで行う内容に応じて down メソッドで行うべき内容はおのずと決まります。
このような単純な内容のマイグレーションは、以下のように up/down メソッドを change メソッドに置き換えることができます。
class CreateUsers < ActiveRecord::Migration def change # ユーザ情報を保持する users テーブルを作成する. create_table :users do |table| # 名前. table.string :name, :null => false # メールアドレス. table.string :email, :null => false # 年齢. table.integer :age, :null => false # 登録日時, 更新日時. table.timestamps end end end
up メソッドの名前を change に変更し、down メソッドを単純に削除するだけです。
マイグレーションの内容を change メソッドに記述しておくと、
「rake db:migrate」コマンドを実行したときは change メソッドの内容がそのまま実行されます。
「rake db:rollback」などスキーマの変更を元に戻すタスクを実行すると、change メソッドに記述した内容の逆の処理が行われます。
change メソッドは、マイグレーションの内容を以下のメソッドだけで記述できる場合のみ利用可能です。
他のスキーマを変更するメソッド(例えば drop_table など)を change メソッド内で使用すると、
「rake db:rollback」などでスキーマの変更を正しく戻せなくなってしまうため、注意が必要です。
- add_column
- add_index
- add_timestamps
- create_table
- remove_timestamps
- rename_column
- rename_index
- rename_table
上記以外のメソッドを使用する場合は up/down メソッドを使用します。