こんにちは!システムエンジニアのオオイシです。
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)が実行します。
マイグレーション(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つの方法があります。
- 「bin/rails g migration クラス名 カラム名:型」で引数にテーブル定義を渡す
- 「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| |
drop_table | テーブルの削除 | drop_table :テーブル名 |
add_column | カラムの追加 | add_column :テーブル名, :カラム名, :型 |
remove_column | カラムの削除 | remove_column :テーブル名, :カラム名 |
change_column | カラムの定義の変更 | change_column :テーブル名, :カラム名, :型 [, カラムオプション] |
rename_column | カラム名の変更 | rename_column :テーブル名, :変更前カラム名, :変更後カラム名 |
add_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が定義されていないためです。対処法に関しては公式に手順が記されていますので、こちらをご覧ください。
まとめ
いかかでしたか?
今回はgenerate migrationコマンドについて解説しました。
generate migrationとは、マイグレーション(migration)ファイルを作成するためのRuby on Railsのコマンドです。
マイグレーション(migration)の使い方を覚えると、データベーステーブルへの追加・変更・削除を何度でも繰り返し実行できるので、ぜひ活用してください。
そして、generate migrationの使い方を忘れてしまったらこの記事を確認してくださいね!