マイグレーション(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の仕組みがよくわかりませんでしたが、わかれば結構単純で、確かに便利です。

MySQLデータ型のYAML表記

mysql⇔propel間の変換表
左側がmysqlで右側がpropel(schema.yml)のデータ型(type)表記です。

<mysql> <propel>
BIGINT BIGINT
BLOB VARBINARY
BOOL TINYINT
CHAR CHAR
DATE DATE
DATETIME TIMESTAMP
DECIMAL DECIMAL
ENUM CHAR
FLOAT FLOAT
INT INTEGER
INTEGER INTEGER
LONGBLOB VARBINARY
LONGTEXT LONGVARCHAR
MEDIUMBOB VARBINARY
MEDIUMINT SMALLINT
MEDIUMTEXT LONGVARCHAR
SET CHAR
SMALLINT SMALLINT
TEXT LONGVARCHAR
TIME TIME
TIMESTAMP TIMESTAMP
TINYBOLB BINARY
TINYINT TINYINT
TINYTEXT VARCHAR
VARCHAR VARCHAR
YEAR INTEGER

 探しても意外に情報が見つかりませんでした。データ型だけでなく細かいオプションの指定の仕方を知りたいのですが。