1. マイグレーション(2)
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.4. データ型
Ruby on Rails(正確には ActiveRecord)では以下のデータ型をサポートしています。
| 型名 | 説明 |
|---|---|
| binary | バイナリ |
| boolean | 真偽値 |
| date | 日付 |
| datetime | 日時 |
| decimal | 固定長整数 |
| float | 浮動小数点数 |
| integer | 整数 |
| primary_key | 主キー |
| string | 文字列 |
| text | テキスト |
| time | 時間 |
| timestamp | タイムスタンプ |
「サポートしている」とは、カラムのデータ型に指定すると使用しているデータベースの適切な型にマッピングされるということです。
例えばデータベースに PostgreSQL を使用しているとすると、string は VARCHAR(255)、integer は INTEGER にマッピングされます。
先ほどの 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
このマイグレーションを実行すると、以下の SQL が PostgreSQL に対して実行されます。
-- ユーザ情報を保持する users テーブルを作成する.
CREATE TABLE users (
-- 主キー.
id SERIAL PRYMARY KEY,
-- 名前.
name VARCHAR(255) NOT NULL,
-- メールアドレス.
email VARCHAR(255) NOT NULL,
-- 年齢.
age INTEGER NOT NULL,
-- 登録日時.
created_at TIMESTAMP,
-- 更新日時.
updated_at TIMESTAMP
);
Ruby on Rails でサポートされているデータ型を使用することで、
実際に使用するデータベースに依存しない形でマイグレーションを記述することができます。
データベース固有のデータ型を指定したい場合は、以下のように文字列でデータ型を指定することもできます。
create_table(:users) do |table|
table.column 'VARCHAR(255)', :name
end
1.5. マイグレーション API
Ruby on Rails が提供するマイグレーション API について解説します。
ここでは全てのオプションについては解説しませんので、適宜 API リファレンスをご参照ください。
create_table(table_name, options={})
table_name に指定した名前のテーブルを作成します。 create_table はブロックを引数として受け取り、カラム定義はブロックの中で行います。
create_table(:users) do |table|
table.string :name, :null => false
end
change_table(table_name, options={})
table_name に指定したテーブルの定義を変更します。 create_table と同じ書式で、既存のテーブル定義をまとめて変更します。
change_table(:users) do |table|
table.string :email, :null => false
end
drop_table(table_name, options={})
table_name に指定したテーブルを削除します。
drop_table(:users)
add_column(table_name, column_name, type, options={})
table_name に指定したテーブルにカラムを追加します。 カラム名は column_name、データ型は type で指定します。 options で指定可能なオプションは多くありますので、ここでは一般的なものを説明します。
# :null オプションで NOT NULL 制約の有無を指定する (デフォルトは true)
add_column(:users, :status, :integer, :null => false)
# :default オプションでデフォルト値を指定する
add_column(:users, :status, :integer, :default => 0)
# :limit オプションで最大長を指定する (文字列型の場合は文字数, バイナリや整数型の場合はバイト数)
add_column(:users, :email, :string, :limit => 1024)
# 固定長整数の精度を :precision, 小数点以下の桁数を :scale オプションで指定する
add_column(:users, :score, :decimal, :precision => 10, :scale => 4)
change_column(table_name, column_name, type, options={})
table_name に指定したテーブルのカラムを変更します。 カラム名は column_name、データ型は type、その他のオプションは options に指定します。
change_column(:users, :email, :string, :limit => 500)
rename_column(table_name, column_name, new_column_name)
table_name に指定したテーブルのカラム名を変更します。 変更前のカラム名を column_name、新しいカラム名を new_column_name に指定します。 データ型や制約などを変更したい場合は change_column を使用します。
rename_column(:users, :name, :name_kanji)
add_index(table_name, column_name, options={})
table_name に指定したテーブルのカラムにインデックスを作成します。 column_name にカラム名、もしくはカラム名の配列を指定します。
# インデックスを作成する
add_index(:users, :email)
# インデックス名を指定する
add_index(:users, :email, :name => 'users_email_index')
# :unique オプションでユニークインデックスを作成する
add_index(:users, :email, :unique => true)
# 複合インデックスを作成する場合はカラム名の配列を指定する
add_index(:users, [:email, :status])
remove_index(table_name, options={})
table_name に指定したテーブルのカラムに作成されたインデックスを削除します。
# カラムを指定して削除する
remove_index(:users, :name)
# 複合インデックスを削除する
remove_index(:users, [:name, :status])
# インデックス名を指定して削除する
remove_index(:users, :name => 'users_email_index')
execute(sql, name=nil)
sql に指定された SQL を実行します。
execute('ALTER TABLE users ADD CONSTRAINT fk_group_id FOREIGN KEY (group_id) REFERENCES groups(id)')

