【Rails入門】generate migrationコマンドの分かりやすいまとめ

こんにちは!システムエンジニアのオオイシです。

Ruby on Railsのgenerate migrationコマンドをご存知ですか?

generate migrationコマンドは、データベーステーブルの継続的な追加・変更するためのマイグレーション(migration)ファイルを作成します。

この記事では

  • generate migrationコマンドとは
  • generate migrationコマンドを使ってみよう

といった基本的な解説から、

  • migrationクラスの命名規則
  • migrationファイルを作成する2つの方法
  • migrationファイルのデータ型一覧
  • migrationファイルのカラムオプション一覧
  • migrationファイルの使い方まとめ
  • migrationを管理するコマンド

などの応用的な使い方に関しても解説していきます。

今回はそんなgenerate migrationコマンドの使い方をわかりやすく解説します!

目次

generate migrationコマンドとは

generate migrationとは、マイグレーション(migration)ファイルを作成するためのrailsコマンドです。

マイグレーションファイルとは、

  • データベーステーブルのカラムの追加・変更・削除
  • indexの追加・変更・削除
  • カラムの名称やデータ型の変更

を実行するためのプログラムファイルのことです。

このマイグレーションファイルは、Ruby on Railsの機能の1つであるマイグレーション(migration)が実行します。

rails_g_migration5

マイグレーション(migration)は、データベーススキーマへの追加・変更・削除を何度でも繰り返し実行できることが特徴です。

それでは、次項でgenerate migrationコマンドを使って見ましょう!

generate migrationコマンドを使ってみよう

generate migrationコマンドの使い方は、

  • bin/rails generate migration マイグレーションクラス名 カラム名:型 …
  • bin/rails g migration マイグレーションクラス名 カラム名:型 …

で実行できます。

「マイグレーションクラス名」は、

  • キャメルケース →  “CreateSample”
  • スネークケース → “create_sample”

のどちらの命名方法でも使えます。

それでは、「g migration コマンド」を実行してサンプルテーブル(samples)を作成してみましょう。

コマンド:

$ bin/rails g migration CreateSample name:string
    Running via Spring preloader in process 12298
          invoke  active_record
          create    db/migrate/20180626081942_create_sample.rb

マイグレーションファイル:

class CreateSample < ActiveRecord::Migration[5.1]
  def change
    create_table :samples do |t|
      t.string :name
    end
  end
end

このようにマイグレーションファイルが作成されました。

データベースに反映して見ましょう。なお、利用するRDMSはMySQLとします。

マイグレート(bin/rails db:migrate):

$ bin/rails db:migrate
Running via Spring preloader in process 12373
== 20180626081942 CreateSample: migrating =====================================
-- create_table(:samples)
   -> 0.0044s
== 20180626081942 CreateSample: migrated (0.0045s) ============================

MySQLでテーブルの定義を確認してみます。

テーブル定義:

$ bin/rails dbconsole
 ~~ 省略 ~~
mysql> desc samples;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

このようにサンプルテーブル(samples)が作成されていることが確認できました。

次項では「bin/rails g migration マイグレーションクラス名」の命名規則について解説して行きます。

なお、migrationの基礎については、こちらで解説しているので参考にしてみてください。

migrationとの関係が深いモデル(model)の解説については、こちらで解説しています。

migrationファイルの設定一覧

ここでは、migrationファイルの命名規則や指定できるデータ型、データベースカラムのオプションについて一覧でまとめてみました。

migrationクラスの命名規則

マイグレーションクラス名は、Railsの命名規則にしたがって次のように命名することをオススメします。

操作内容クラス名コマンド実行例
テーブルを作成Createテーブル名bin/rails g migration CreateSample
テーブルの削除Dropテーブル名bin/rails g migration DropSample
カラムの追加Addカラム名Toテーブル名bin/rails g migration AddColumnToSample
カラムの削除Removeカラム名Fromテーブル名bin/rails g migration RemoveColmnFromSample
カラム名の変更RenameFrom変更前カラム名To変更後カラム名Onテーブル名bin/rails g migration RenameFromBeforeColumnToAfterCoulumnOnSample
カラムの定義を変更Change変更するカラムOnテーブル名bin/rails g migration ChangeColumnOnSample
Indexの作成AddIndexカラム名Toテーブル名bin/rails g migration AddIndexColumnToSample
Indexの削除RemoveIndexカラム名Fromサンプルbin/rails g migration RemoveIndexColumnFromSample

Railsの命名規則に従うと、いつどのようにマイグレートしたかが時系列でわかるので、開発中のテーブル定義のやり直しが容易です。

migrationファイルを作成する2つの方法

マイグレーションファイルを作成するには2つの方法があります。

  1. 「bin/rails g migration クラス名 カラム名:型」で引数にテーブル定義を渡す
  2. 「bin/rails g migration クラス名」でテーブル定義をマイグレーションファイルに記述

前者は、簡単なテーブル操作の場合は使い勝手がよいですが、複雑なテーブル定義の場合は煩雑で使いにくいため、後者の方法で作成することをオススメします。

以降ではマイグレーションファイルの記述方法の詳細について解説していきます。

migrationファイルのデータ型一覧

マイグレーションファイルで扱えるデータ型を一覧にまとめました。

MySQLでのテーブル定義の状態も比較したので確認してみてください。

マイグレーションファイル:

class CreateSample < ActiveRecord::Migration[5.1]
  def change
    create_table :samples do |t|
      t.string    :string_col       # 文字列
      t.text      :text_col         # 長い文字列
      t.integer   :integer_col      # 整数
      t.float     :float_col        # 浮動小数点数(float)
      t.decimal   :decimal_col      # 浮動小数点数(decimal)
      t.datetime  :datetime_col     # 日時
      t.date      :date_col         # 日付
      t.time      :time_col         # 時間
      t.timestamp :timestamp_col    # 日時(timestamp)
      t.boolean   :boolean_col      # true:1, false:0
      t.binary    :binary_col       # バイナリ(blob)
      t.references :sample2         # 参照(sample2sテーブル)
    end
  end
end

テーブル定義:

mysql> desc samples;
+---------------+---------------+------+-----+---------+----------------+
| Field         | Type          | Null | Key | Default | Extra          |
+---------------+---------------+------+-----+---------+----------------+
| id            | bigint(20)    | NO   | PRI | NULL    | auto_increment |
| string_col    | varchar(255)  | YES  |     | NULL    |                |
| text_col      | text          | YES  |     | NULL    |                |
| integer_col   | int(11)       | YES  |     | NULL    |                |
| float_col     | float         | YES  |     | NULL    |                |
| decimal_col   | decimal(10,0) | YES  |     | NULL    |                |
| datetime_col  | datetime      | YES  |     | NULL    |                |
| date_col      | date          | YES  |     | NULL    |                |
| time_col      | time          | YES  |     | NULL    |                |
| timestamp_col | timestamp     | YES  |     | NULL    |                |
| boolean_col   | tinyint(1)    | YES  |     | NULL    |                |
| binary_col    | blob          | YES  |     | NULL    |                |
| sample2_id    | bigint(20)    | YES  | MUL | NULL    |                |
+---------------+---------------+------+-----+---------+----------------+
13 rows in set (0.00 sec)

なお、PostgreSQLやSQLiteなどの利用するRDMSの違いを意識しなくてもいいようにマイグレートは行われているので、データベースごとの記述を変える必要はありません。

便利ですね!

migrationファイルのカラムオプション一覧

マイグレーションファイルは、NULL制約、デフォルト値、長さなどのカラムオプションを任意に定義することができます。

マイグレーションファイル:

class CreateSample2 < ActiveRecord::Migration[5.1]
  def change
    create_table :sample2s do |t|
      t.string  :not_null, null: false           # NOT NULL制約
      t.string  :unique,   unique: true          # ユニーク制約
      t.string  :default,  default: "default"    # デフォルト値
      t.string  :limit,    limit: 10             # LIMIT(最大長)
      t.string  :index,    index: true           # インデックス
      t.string  :index,    comment: "comment!"   # コメント
    end
  end
end

テーブル定義:

CREATE TABLE `sample2s` (
  `id`       bigint(20)   NOT NULL AUTO_INCREMENT,
  `not_null` varchar(255) NOT NULL,
  `unique`   varchar(255) DEFAULT NULL,
  `default`  varchar(255) DEFAULT 'default',
  `limit`    varchar(10)  DEFAULT NULL,
  `index`    varchar(255) DEFAULT NULL COMMENT 'comment!',
  PRIMARY KEY (`id`),
  KEY `index_sample2s_on_index` (`index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

このように、カラムオプションを定義することができました。

つづいて、マイグレーションファイルのいろいろな書き方について詳しく解説していきます。

migrationファイルの使い方まとめ

ここでは、マイグレーションファイルの詳しい書き方をまとめました。

マイグレーションファイルの基本構造

「bin/rails g migration マイグレーションクラス名」コマンドを実行すると空のchangeメソッドが定義されたマイグレーションファイルが作成されます。

class マイグレーションクラス名 < ActiveRecord::Migration[5.1]
  def change
     # データベーススキーマへの定義を記述
  end
end

具体的なテーブル追加などのテーブル定義するためにはchangeメソッドの内容を記述する必要があります。

次項を参照ください。

データベーステーブルへの定義メソッド一覧

changeメソッド内に記述できるテーブル定義のためのメソッド一覧は次のとおりです。

メソッド説明簡単な例
create_tableテーブルの作成create_table :テーブル名 do |t|
t.型 :カラム名
end
drop_tableテーブルの削除drop_table :テーブル名
add_columnカラムの追加add_column :テーブル名, :カラム名, :型
remove_column
カラムの削除remove_column :テーブル名, :カラム名
change_columnカラムの定義の変更change_column :テーブル名, :カラム名, :型 [, カラムオプション]
rename_columnカラム名の変更rename_column :テーブル名, :変更前カラム名, :変更後カラム名
add_indexインデックスの作成add_index :テーブル名, :カラム名
# 複合Index
add_index :テーブル名, [:カラム名,:カラム名]
remove_indexインデックスの削除remove_index :テーブル名, :カラム名
add_referenceリファレンス(外部参照)の作成add_reference :テーブル名, :参照名,[ polymorphic: true, index: true]

このように、SQLのテーブル定義と同等のことがマイグレーションファイルで定義できることがお分かり頂けたと思います。

以降では、代表的なメソッドをサンプルコードを交えて紹介していきます。

カラムの追加(add_column)

カラム追加の定義は、

  • add_column :テーブル名, :カラム名, :データ型 [,カラムオプション]

となります。

string_colカラムを追加するサンプルを確認してみましょう。

マイグレート(bin/rails db:migrate)する前:

mysql> desc samples;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

コマンド:

bin/rails g migration AddStringCol2ToCreateSample
Running via Spring preloader in process 12905
      invoke  active_record
      create    db/migrate/20180627051701_add_string_col2_to_create_sample.rb

マイグレーションファイル:

class AddStringCol2ToCreateSample < ActiveRecord::Migration[5.1]
  def change
   add_column :samples, :string_col2, :string
  end
end

マイグレート(bin/rails db:migrate)した後:

mysql> desc samples;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | YES  |     | NULL    |                |
| string_col2 | varchar(255) | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

このように、カラム追加されたことが確認できました。

カラム定義の変更(change_column)

カラムの定義の変更は

  • change_column :テーブル名, :カラム名, 変更後の定義

となります。

string型のカラムをintegerに変更し、カラムの名変更するサンプルを確認してみましょう。

bin/rails g migration ChangeString2ColOnSample
Running via Spring preloader in process 13061
      invoke  active_record
      create    db/migrate/20180627052857_change_string2_col_on_sample.rb

マイグレーションファイル:

class ChangeString2ColOnSample < ActiveRecord::Migration[5.1]
 def change
   change_column :samples, :string_col2, :integer
   rename_column :samples, :string_col2, :int_col2
 end
end

マイグレート(bin/rails db:migrate)した後:

mysql> desc samples;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | YES  |     | NULL    |                |
| int_col2    | int(11)      | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

このようにマイグレーションファイルの作成はとてもカンタンなことがお分かり頂けたと思います。

migrationを管理するコマンド

マイグレーションの反映状況やマイグレーションをロールバックをするための便利なコマンドについて紹介していきます。

migrationの状況を見る(rails db:migrate:status)

マイグレーションファイルを実行するためには「bin/rails db:migrate」コマンドを実行しますが、どのマイグレーションをどこまで実行したかを確認するためには、

  • bin/rails db:migrate:status

を実行します。

サンプルを確認してみましょう。

$ bin/rails db:migrate:status
Running via Spring preloader in process 12582
database: sample_app_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20180626081942  Create sample
  down    20180626091939  Change string2 col on sample1

Statusの見方は、

  • up   → データベース反映済
  • down    →データベース未反映

となります。

マイグレートした後のステータスの状態を確認してみましょう。

マイグレートコマンド:

$ bin/rails db:migrate
Running via Spring preloader in process 12620
== 20180626091939 ChangeString2ColOnSample1: migrating ========================

マイグレートステータス確認:

$ bin/rails db:migrate:status
Running via Spring preloader in process 12658
database: sample_app_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20180626081942  Create sample
   up     20180626091939  Change string2 col on sample1

このように、downからupしデータベースに反映されたことが確認できました。

migrationをロールバックする(rails db:rollback)

反映したマイグレーションを戻すためには、「bin/rails db:rollback」を実行します。

サンプルで確認してみましょう。

マイグレートロールバック:

$ bin/rails db:rollback
Running via Spring preloader in process 12696
== 20180626091939 ChangeString2ColOnSample1: reverting ========================
== 20180626091939 ChangeString2ColOnSample1: reverted (0.0074s) ===============

マイグレートステータス確認:

Running via Spring preloader in process 12734

database: sample_app_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20180626081942  Create sample
  down    20180626091939  Change string2 col on sample1

このようにup→downに変わり、マイグレーションを1つ戻すことが確認できました。

なお、今回の手順を上から順に実行した場合、change_columnの部分でエラーが発生します。これはchangeメソッドの行える処理にchange_columnが定義されていないためです。対処法に関しては公式に手順が記されていますので、こちらをご覧ください。

参照:Active Record マイグレーション

まとめ

いかかでしたか?

今回はgenerate migrationコマンドについて解説しました。

generate migrationとは、マイグレーション(migration)ファイルを作成するためのRuby on Railsのコマンドです。

マイグレーション(migration)の使い方を覚えると、データベーステーブルへの追加・変更・削除を何度でも繰り返し実行できるので、ぜひ活用してください。

そして、generate migrationの使い方を忘れてしまったらこの記事を確認してくださいね!

この記事を書いた人

システムエンジニア歴15年のオオイシです!好物は Java と Ruby。プログラミング、システムアーキテクトからマネジメントに到るまでなんでも食べます。
システム開発の相談やお困りごとがあればお気軽に
makoto.oishi.0705@gmail.com まで連絡頂けると幸いです

目次