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)')