Rails Migration(マイグレーション)入門。マイグレーションコマンドまとめ
railsのコンソールコマンドは数多くありますが今回はそのなかでもマイグレーションに関係するコマンドについて解説してきます。
マイグレーション関連コマンドを紹介
rails genarate migration/model | マイグレーションを生成
rails generate migrationはマイグレーションを生成するコマンドです。generateとと書くと長いのでrails g migrationと書くことができます。
モデルも同時に作成する場合はrails g modelとして実行します。
テーブルを新規作成する場合はrails g modelを使う場合が多く、既存のテーブルに変更を加える場合はrails g migrationとする場合が多いです。
ちなみに作成するマイグレーション名をAddXXXXToYYYYやRemoveXXXXFromYYYYとするとマイグレーション生成と同時に追加するカラムのコードも記述してくれます。
$ rails g migration AddNewColumnsToBlogs new_column:string
Running via Spring preloader in process 59915
invoke active_record
create db/migrate/20181009084716_add_new_columns_to_blogs.rb
20181009084716addnewcolumnsto_blogs.rb
class AddNewColumnsToBlogs < ActiveRecord::Migration[5.1]
def change
add_column :blogs, :new_column, :string
end
end
rails db:migrate | マイグレーション実行
rails db:migrateでマイグレーションを実行することができます。schema_migrationsというテーブルですでに実行済みのマイグレーションかどうかというのを管理しているので、このコマンドを実行するとdb/migrations配下の実行されていないファイルがファイル名順に実行されていきます。
$ rails db:migrate
== 20171229004249 CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0106s
== 20171229004249 CreateUsers: migrated (0.0107s) =============================
== 20171229071016 CreateBlogs: migrating ======================================
-- create_table(:blogs)
-> 0.0090s
== 20171229071016 CreateBlogs: migrated (0.0091s) =============================
rails db:migration:upコマンドを使うとファイルを指定して実行可能です。ファイルを指定して実行する場合は
rails db:migrate:up VERSION=[バーション番号]
として実行します。バージョン番号とは、マイグレーションファイルの数字の部分のことです。
rails db:migrate:down | マイグレーションの実行を取り消し
db:migrate:downではバージョン番号を指定して、マイグレーションの実行を取り消しをしてくれます。
rails db:migrate:up VERSION=[バーション番号]
$ rails db:migrate:down VERSION=20181007040853
== 20181007040853 CreateCategories: reverting =================================
-- drop_table(:categories)
-> 0.0029s
== 20181007040853 CreateCategories: reverted (0.0085s) ========================
downをしたときにはmigrationファイルでchangeメソッドに記述した逆操作を自動で行ってくれます。createtableしているのであればdroptable、addcolumnした場合はremovecolumnといった具合に自動でよしなにマイグレーションでの変更を元に戻してくれます。changeメソッドの記述によってはうまく逆操作できない場合があるので、そういった場合はマイグレーションファイルにupメソッドとdownメソッドを記述します。
rails db:migrate:redo | マイグレーションのやり直し
rails db:migrate:redoは一旦最新のマイグレーションをdownした後にupしてくれます。マイグレーション実行後にマイグレーションファイルを書き換えた場合などに使用するのですが、逆操作がちゃんとできるかどうかというところの確認にも使用できます。
$ rails db:migrate:redo
== 20181007040853 CreateCategories: reverting =================================
-- drop_table(:categories)
-> 0.0034s
== 20181007040853 CreateCategories: reverted (0.0074s) ========================
== 20181007040853 CreateCategories: migrating =================================
-- create_table(:categories)
-> 0.0142s
== 20181007040853 CreateCategories: migrated (0.0143s) ========================
環境変数にSTEP=2とすると直近のマイグレーション二つ分をredoしてくれます。
$ rails db:migrate:redo STEP=2
rails db:seed | シードデータの投入
rails db:seedでdb/seed.rbに記述されたシードを実行します。シードデータとはテスト用のデータですが、テストデータが必要になるたびに手でデータを作成してというのは効率がわるいのでseedデータを作成しておくのが良いです。
$ rails db:seed
execute 10_add_review_item_master.rb seed
execute user.rb seed
こちらの例では新たにdb/seeds/というディレクトリにシード作成用ファイルを格納して、ひとつずつ実行する形としています。
db/seeds.rb
development_seed_files = Dir[ Rails.root.join('db', 'seeds', '*.rb') ].sort
ActiveRecord::Base.transaction do
development_seed_files.each do |file|
puts "execute #{File.basename(file)} seed"
load(file)
end
end
rails db:create | データベースの作成
rails db:createでdatabase.ymlの設定を見ながらデータベースを作成できます。
rails db:drop
rails db:createでdatabase.ymlの設定を見ながらデータベースを作成できます。
rails db:migrate:reset | マイグレーションのリセット
rails db:migrate:resetでデータベースを削除してまっさらな状態にしてから全てのマイグレーションをやり直しできます。
$rails db:migrate:reset
Dropped database 'sample_development'
Dropped database 'sample_test'
Created database 'sample_development'
Created database 'sample_test'
== 20171229004249 CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0092s
== 20171229004249 CreateUsers: migrated (0.0094s) =============================
(略)
== 20181007040853 CreateCategories: migrating =================================
-- create_table(:categories)
-> 0.0089s
== 20181007040853 CreateCategories: migrated (0.0090s) ========================
rails db:rollback | マイグレーションのロールバック
rails db:rollbackデータベースを一つ前の状態にもどします。
rails db:rollback
== 20181007040853 CreateCategories: reverting =================================
-- drop_table(:categories)
-> 0.0033s
== 20181007040853 CreateCategories: reverted (0.0072s) ========================
こちらもSTEP=3というような環境変数を与えることで数をしてしてバージョンを戻すことができます。
rails db:setup
アプリを動かすために必要なセットアップの作業を一気通貫で処理できます。
- データベースの作成
- マイグレーションの実行
- シードの投入
$ rails db:setup
Created database 'sample_development'
Created database 'sample_test'
-- create_table("blogs", {:force=>:cascade, :options=>"ENGINE=InnoDB DEFAULT CHARSET=utf8"})
-> 0.0267s
-- create_table("books", {:force=>:cascade, :options=>"ENGINE=InnoDB DEFAULT CHARSET=utf8"})
-> 0.0141s
(略)
-> 0.0132s
-- create_table("users", {:force=>:cascade, :options=>"ENGINE=InnoDB DEFAULT CHARSET=utf8"})
-> 0.0099s
execute 10_add_review_item_master.rb seed
execute user.rb seed
まとめ
こうやって一覧で見てみると結構便利なコマンドありますね。私自身Railsはじめたてのころはここらへんをカバーしておらず、rails db:migrate:resetを知らないのでrails db:migrate:downしてからupするようなことをたくさんしていました。
結局は同じことですし、細かいことではあるのですが日々非効率なことを繰り返しているのはエンジニアとしてまずいので、railsを学んでいるかたはこういったところからひとつずつ抑えていけると良いのかなと思います。