Help us understand the problem. What is going on with this article?

RailsのDBとmirationファイルとschemaの関係

More than 3 years have passed since last update.

背景

データベースのテーブルに「カラムを追加して」とか「カラム削除して」とかお願いすると、なぜかできないって方がたまにいたりする。

なぜかなと思ってよくよく確認して見ると、

  • migrationファイルを編集して、rails db:migrateするだけだったり
  • schema.rbを編集するだけだったり

みたいなことがあるようです。

なので、データベースのテーブルなどが生成、編集されるフローをまとめてみることにしました。

データベースのテーブルなどが生成、編集されるフロー

簡単な流れを書くと以下のとおりです。

  1. database.ymlの作成(データベースの設計図に当たる)
  2. rails db:createの実行(database.ymlを元にデータベースを作成)
  3. migrationファイル(xxxxxxxxx_create_blogs.rbみたいなやつ)の作成(テーブルの設計図に当たる)
  4. rails db:migrateの実行(migrationファイルを元にテーブルを作成編集)
  5. 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は他の使いみちがあるので、削除はおすすめしません。

kakiuchis
京都の大学と大学院で光合成の基礎研究→中国のパン屋で見習いパン職人→インドネシアの工場で小さな備品調達→IT人材サービス会社で苦手な営業担当→RubyとAIのプログラミングスクールでちょっとだけ教材作成お手伝い。
itpm-gk
頑張るエンジニアを応援する会社です。まだまだ発展途上です!
https://www.itpm-gk.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away