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