スポンサーリンク
マイグレーションファイルとは
さて、前回の続きになりますが、モデル作成コマンドによって、モデルと一緒に作られたマイグレーションファイル(20161206045030_create_members.rb)というのがありました。
1 2 3 4 5 6 7 8 | Running via Spring preloader in process 26120 Expected string default value for '--jbuilder'; got true (boolean) invoke active_record create db/migrate/20161206045030_create_members.rb create app/models/member.rb invoke test_unit create test/models/member_test.rb create test/fixtures/members.yml |
マイグレーションファイルというのは、テーブルを作成するための設計図みたいなものです。マイグレーションファイルを実行することで初めてテーブルが作られます。
マイグレーションファイルの中身を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 | class CreateMembers < ActiveRecord::Migration[5.0] def change create_table :members do |t| t.string :name t.string :yomi t.string :phone t.timestamps end end end |
クラス名が、CreateMembersになっており、ファイル名(xxxxxxx_create_members.rb)との関係から、これらもRailsの命名規則に則っているのが分かると思います
ファイル名 | xxxxxxxxxx_create_テーブル名.rb |
---|---|
クラス名 | Createテーブル名(先頭のみ大文字) |
CreateMembersクラスで定義されているのは、changeメソッドのみです。changeメソッドは、このマイグレーションファイルが実行された際に呼ばれるメソッドです。
changeメソッドの中で、create_tableというメソッドが呼ばれていますが、これがその名の通りテーブルを作成する処理を行っています。
1 2 3 4 5 6 7 8 9 10 11 | class CreateMembers < ActiveRecord::Migration[5.0] def change create_table :members do |t| t.string :name t.string :yomi t.string :phone t.timestamps end end end |
モデル作成コマンドで入力したように、3つのカラム(name、yomi、phone)をそれぞれのデータ型(string)で作っているのが分かると思います。
t.timestampsというのは、このテーブルに書き込み・修正した際にそのタイムスタンプを保存しておく為のカラムを作っています。これはモデル作成時に指定したカラムとは別に付随してきます。
このマイグレーションファイルを実行することで、その指示通りに、データベース内にmembersテーブルが作られるわけです。
スポンサーリンク
マイグレーションファイルを実行する
では実際に、このマイグレーションファイルを実行してみましょう。マイグレーションファイルは、コンソールにてコマンド操作で実行します。以下のコマンドを打ちましょう。
1 | $ rake db:migrate |
注)railsじゃなくてrakeです
すると、以下のようにmembersテーブルを作成した旨がコンソールに出力されます。
1 2 3 4 | == 20161206045030 CreateMembers: migrating ==================================== -- create_table(:members) -> 0.0033s == 20161206045030 CreateMembers: migrated (0.0037s) =========================== |
これだけです。簡単ですね。
しかしながら、上記のコマンドは特にどのマイグレーションファイルを実行するかを指定していないですよね?? にも関わらずmembersテーブルが正確に作られました。
このrake db:migrateというコマンドは何をしているのかと言うと、/db/migrateディレクトリに在るマイグレーションファイルの中から未実行のファイルを見つけて実行しているんです。
つまりマイグレーションファイルというのは、各々のファイルについて実行したかどうかを内部で全て管理されており、たった一度だけ実行されるようになっているものなんです。
マイグレーションファイルとスキーマファイルの関係
マイグレーションファイルが実行されたことよって、テーブルが作られたわけですが、それとは別に自動的に作成されたファイルがあります。/db/schema.rbです。
確認してみて下さい。
1 2 3 4 5 6 7 8 9 10 11 | ActiveRecord::Schema.define(version: 20161206045030) do create_table "members", force: :cascade do |t| t.string "name" t.string "yomi" t.string "phone" t.datetime "created_at", null: false t.datetime "updated_at", null: false end end |
このファイル(schema.rb)はスキーマファイルと呼ばれる、現在のデータベースの構造を記録したファイルです。
自分でモデル作成時に指定したname、yomi、phoneといったカラムだけでなく、created_atと、updated_atというタイムスタンプ用のカラムも作られているのが分かると思います(マイグレーションファイルのt.timestampsによるものです)。
※idカラムに関してはスキーマファイルには表示されません。
実行ファイルであるマイグレーションファイルを実行したことによって、スキーマファイルが更新されたわけです。言わばスキーマファイルはマイグレーションファイルが実行された結果を表しています。
もし後から、テーブルにカラムを1つ追加したいという場合などは、「membersテーブルにこういうカラムを追加します」という指示を書いたマイグレーションファイルを作って実行することで、テーブル構造を変化させることができます。
新たなマイグレーションファイルを実行するたびに、データベースの構造が変化し、スキーマファイルは最新の状態に自動更新されることになります。
そういう意味では、マイグレーションファイルは設計図というよりも指示書というニュアンスに近いと言えます。マイグレーションファイルに書いているのはデータベースの完成予定図ではなく、作り方(手順)です。
ここでは詳しくやりませんが、この仕組み(マイグレーションファイルとスキーマファイル)はデータベースのバージョン管理(1つ前の状態に戻すとか)や、データベースを1から再構築したいといった際に、非常に役立ちます。
データベースが壊れるのはwebアプリケーションにとって最悪の事態なので、データベース周りの変更は出来る限り安全にやりたいものです。その為に、この一見面倒なマイグレーションという仕組みがあるわけです。
さて、いよいよ準備は整いました。次回からはこのデータベースを使って、電話帳の機能を作っていきましょう。