マイグレーション(migrate)の利用法とバージョン管理

mysqlにアクセスすると、giftテーブルへのカラム追加、orderテーブルの生成がされていることが確認できます。
rake db:migrate コマンドを実行すると、002,003のself.upメソッドが実行されました。このように一番大きな数字のファイルまですべて実行します。
逆に以下のコマンドを実行してみましょう。

 上記のページを参考にやった見ました。ただ、最近のRailsでは001とかの連番ではなくなり日付と時刻(たぶん世界標準時刻)になったみたいです。


 次のように実行した見たところ、MySQLも変更されていました。
migrateの実行

u8w@u8w-desktop:~/Rails/dbtest$ ls db/migrate/
20090817174423_create_gifts.rb  20090817181649_add_column_note.rb
u8w@u8w-desktop:~/Rails/dbtest$ rake db:migrate VERSION=20090817174423
(in /home/u8w/Rails/dbtest)
==  AddColumnNote: reverting ==================================================
-- remove_column(:gifts, :note)
   -> 0.0083s
==  AddColumnNote: reverted (0.0088s) =========================================

u8w@u8w-desktop:~/Rails/dbtest$

MySQLで確認

mysql> desc gifts;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment | 
| category   | varchar(255) | NO   |     | NULL    |                | 
| name       | varchar(50)  | YES  |     | NULL    |                | 
| price      | int(11)      | YES  |     | NULL    |                | 
| created_at | datetime     | YES  |     | NULL    |                | 
| updated_at | datetime     | YES  |     | NULL    |                | 
| note       | varchar(255) | YES  |     | NULL    |                | 
+------------+--------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

mysql> desc gifts;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| category   | varchar(255) | NO   |     | NULL    |                |
| name       | varchar(50)  | YES  |     | NULL    |                |
| price      | int(11)      | YES  |     | NULL    |                |
| created_at | datetime     | YES  |     | NULL    |                |
| updated_at | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

mysql>

初回作成

u8w@u8w-desktop:~/Rails/dbtest$ cat db/migrate/20090817174423_create_gifts.rb
class CreateGifts < ActiveRecord::Migration
  def self.up
    create_table :gifts do |t|
      t.string :category,:null=>false
      t.string :name,:limit=>50
      t.integer :price
      t.timestamps
    end
  end

  def self.down
    drop_table :gifts
  end
end
u8w@u8w-desktop:~/Rails/dbtest$

変更(カラムを追加)

u8w@u8w-desktop:~/Rails/dbtest$ cat db/migrate/20090817181649_add_column_note.rb
class AddColumnNote < ActiveRecord::Migration
  def self.up
    add_column :gifts,:note,:string
  end

  def self.down
  remove_column :gifts,:note
  end
end
u8w@u8w-desktop:~/Rails/dbtest$

設定ファイルを追加したコマンド

ruby script/generate migration add_column_note



 初めは馴染みにくいというか、migrateの仕組みがよくわかりませんでしたが、わかれば結構単純で、確かに便利です。