目次へ

1. マイグレーション(1)

2012/09/24 シナジーマーケティング(株) 鈴木 圭

1.1. マイグレーションとは

マイグレーション(Migration)は「移行」という意味の言葉です。
Ruby on Rails ではデータベースのスキーマを変更することを意味します。

Ruby on Rails のマイグレーション機能を利用すると以下のメリットがあります。

  • スキーマ変更を Ruby で記述することができる。
  • スキーマのバージョン管理を行うことができる。

システムを開発していると、新機能の追加などのタイミングでスキーマを変更することがあります。
SQL でスキーマを変更する場合は、CREATE TABLE 文や ALTER TABLE 文などの DDL を使用しますが、
Ruby on Rails では、それらの処理を行うメソッドが提供されているため、Ruby コードで記述することができます。

データベースのスキーマを変更するときには、全ての環境で漏れなく作業を行うことが重要です。
例えば、開発環境(development 環境)と本番環境(production 環境)があるとします。
スキーマを変更する場合は、開発環境と本番環境の両方のスキーマを忘れずに変更することが重要です。

一般的に、開発環境と本番環境でスキーマを変更するタイミングは異なります。
開発環境で動作確認を行った後に、本番環境のスキーマを変更するためです。
そのため、どの環境までスキーマ変更を実施したのか管理する必要が生じます。

その管理を人手で行うのは手間ですが、Ruby on Rails ではスキーマのバージョン管理機能が提供されています。
Ruby on Rails では、マイグレーションを実行するとその情報がデータベースに記録されます。
そしてマイグレーションを実行すると(「rake db:migrate」コマンドを実行すると)、
データベースに記録された情報を元に、未実行のマイグレーションだけが実行されます。

マイグレーションイメージ

1.2. マイグレーションの作成と実行

例として、ユーザ情報を保持する users テーブルを作成するマイグレーションを作成してみましょう。

テーブルの構成は以下の通りです。

論理名 物理名 データ型
ID id 主キー(primary_key)
名前 name 文字列(string)
メールアドレス email 文字列(string)
登録日時 created_at タイムスタンプ(timestamp)
更新日時 updated_at タイムスタンプ(timestamp)

それでは以下のコマンドを実行してください。

rails generate migration CreateUsers

実行すると db/migration/ ディレクトリに「YYYYMMMDDHHMMSS_create_users.rb」という名前のファイルが生成されます。
ここで YYYYMMDDHHMMSS にはタイムスタンプ(例えば ‘20120101123050’ のような文字列)が入ります。
Ruby on Rails はマイグレーションの情報がデータベースに記録されると前述しましたが、このタイムスタンプがデータベースに記録されます。

生成されたファイルを開くと、以下のようになっています。

    class CreateUsers < ActiveRecord::Migration
      def up
      end

      def down
      end
    end

マイグレーションの実体は ActiveRecord::Migration を継承したクラスです。
CreateUsers クラスには up メソッドと down メソッドが定義されています。
up メソッドにはスキーマを変更する処理、down メソッドには行った変更を元に戻す処理を記述します。
ここでは up メソッドに users テーブルを作成する処理、down メソッドに 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

up メソッドでは create_table メソッドを使用して users テーブルを作成します。
create_table メソッドはテーブル名とカラム定義を行うブロックを受け取ります。
ブロックの引数 table は ActiveRecord::ConnectionAdapters::TableDefinition クラスのインスタンスであり、
カラムを定義するためのメソッドを提供しています。

ここではユーザの情報としては名前(name)、メールアドレス(email)、及び年齢(age)を定義しています。
name と email は文字列型(string 型)、age は整数型(integer)です。
また、name、email、age ともに NOT NULL 制約(:null => false)を指定しています。

主キーについて注意があります。
Ruby on Rails では、デフォルトで整数型の id という名前のカラムが主キーであるとして扱われます。
テーブルの主キーを決めるときに、ナチュラルキー(自然キー)とサロゲートキー(代理キー)のどちらを採用するかが一つの分かれ道となります。
ナチュラルキーとはシステム外部から与えられる情報で構成される主キーのことであり、例えば社員番号や商品番号などが該当します。
サロゲートキーは人工キーとも呼ばれ、システム内部で生成された一意な値であり、一意であること以外に意味を持たない値です。
どちらを採用するか議論が分かれるところですが、Ruby on Rails ではデフォルトでサロゲートキーが使用されます。
上記コードでは主キーに関する記述を行っていませんが、create_table メソッドによって自動的に整数型の id カラムが作成されます。

ブロックの最後に「table.timestamps」という記述があります。
これは登録日時(created_at)と更新日時(updated_at)を保持するタイムスタンプ型のカラムを作成することを意味します。
Ruby on Rails はレコードの作成日時や更新日時を自動的に記録する仕組みを持っています。
以下の名前のカラムがあると、次章で解説する ActiveRecord でデータを登録または更新した時に自動的に値が設定されます。

カラム名 データ型 説明
created_on date 作成日
created_at timestamp 作成日時
updated_on date 更新日
updated_at timestamp 更新日時

時間までは必要無い場合は created_on と updated_on を使用します。

down メソッドには drop_table メソッドを使用して users テーブルを削除する処理を記述しています。

それではマイグレーションを実行しましょう。

rake db:migrate

※マイグレーションは QuickStart 3. Railsアプリケーションの作成 でご説明した database.yml で指定されたデータベースで実行されます。
デフォルトでは development 環境のデータベースで実行されます。

マイグレーションに成功すれば、データベースに users テーブルが作成されているはずです。
以下のコマンドでデータベースに接続することができますので、実際にテーブルが作成されているか確認しましょう。

rails dbconsole

確認の仕方は使用しているデータベースに依存しますが、
SQLite では「.tables」、PostgreSQL では「\dt」、MySQL では「show tables;」でテーブル一覧を表示できます。
テーブル一覧を表示すると users テーブルのほかに schema_migrations というテーブルがあることに気付かれると思います。
schema_migrations はマイグレーションの情報が記録される大切なテーブルです。
間違って更新や削除などの操作をしないように注意しましょう。

1.3. マイグレーションファイルの名前

マイグレーションの名前(クラス名)は重複しなければ自由に決めることができますが、以下のようにすると分かりやすいでしょう。

マイグレーション内容 ファイル名の形式
テーブルの作成 Create<テーブル名> CreateUsers
カラムの追加 Add<カラム名>To<テーブル名> AddEmailToUsers
カラムの削除 Remove<カラム名>From<テーブル名> RemoveEmailFromUsers

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ