背景
データベースのテーブルに「カラムを追加して」とか「カラム削除して」とかお願いすると、なぜかできないって方がたまにいたりする。
なぜかなと思ってよくよく確認して見ると、
-
migration
ファイルを編集して、rails db:migrate
するだけだったり -
schema.rb
を編集するだけだったり
みたいなことがあるようです。
なので、データベースのテーブルなどが生成、編集されるフローをまとめてみることにしました。
データベースのテーブルなどが生成、編集されるフロー
簡単な流れを書くと以下のとおりです。
-
database.yml
の作成(データベースの設計図に当たる) -
rails db:create
の実行(database.yml
を元にデータベースを作成) -
migration
ファイル(xxxxxxxxx_create_blogs.rb
みたいなやつ)の作成(テーブルの設計図に当たる) -
rails db:migrate
の実行(migration
ファイルを元にテーブルを作成編集) - 4の結果が
schema.rb
に反映される
では順を追って説明していきます。
database.ymlについて
これはrails new
で自動作成されるので、あまり意識しませんよね。
実はdatabase.yml
を元にデータベースが作成されているのです。
rails db:createについて
これはdatabase.yml
を元にデータベースを作成するコマンドです。
テーブル云々には関係無いです。
つまりアプリケーション作成において、1度実行するだけでよいコマンドです。
(まれにDB壊してもう一度作りたいときとかは2回目を実行したりもします)
migrationファイルについて
これはscaffold
とかrails g model
とかで自動生成されたりもします。
ただ、migration
ファイルはテーブルの設計書にすぎないです。
rails db:migrateについて
これはmigration
ファイルを元にテーブルを作成編集するコマンドです。
つまり、migration
ファイルを作っただけではテーブルは変化しません。
rails db:migrate
を実行してテーブルが変化します。
ここ重要!
さらに、一度設計書として参照されたmigration
ファイルは、次回以降のrails db:migrate
参照対象からはずれます。
つまり、一度作ったテーブルを変更するには、新しいmigration
ファイルを作成し、rails db:migrate
を実行する必要があるのです。
※roll back
などを使う方法もありますが、ここでは割愛します。
schema.rbについて
rails db:migrate
の実行結果が反映されるファイルです。
まとめ
- 一度作ったテーブルを変更するには、新しい
migration
ファイルを作成し、rails db:migrate
を実行する必要がある -
schema.rb
は結果を反映するだけ。編集してもテーブルが変化するわけではない。schema.rb
を削除してもアプリは動くのです。
※ただ、schema.rb
は他の使いみちがあるので、削除はおすすめしません。