110
90

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2017-12-25

背景

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

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

  • 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は他の使いみちがあるので、削除はおすすめしません。

110
90
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
110
90

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?