0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【超初心者向け】`rails db:migrate` のギモン!一度実行したテーブル設計図を直しても反映されないのはなぜ?

Posted at

1. はじめに:テーブル設計の「やり直し」問題

こんにちは!Railsで開発を始めたばかりだと、テーブル(データの入れ物)の設計を途中で変更したくなりますよね。

今回、私が困ったのはこの状況です。

  • 起こったこと: posts テーブルを作るための設計図(マイグレーションファイル)を作って実行した後に、「あ、このカラム(項目)も必要だった!」と設計図を直しました。
  • 期待した結果: rails db:migrate をもう一度実行すれば、直した内容がデータベース(データ保存場所)に反映されるはずだと思っていました。
  • 実際の結果: 何も起こらない! 実行ログも出ないし、テーブルの項目も変わっていませんでした。

🚨 結論!

一度実行して「OK」となった設計図(マイグレーションファイル)は、後から編集しても Railsには無視されてしまいます。


2. なぜ変更が無視されるのか?(Railsの「チェックリスト」の話)

どうして、せっかく直した設計図が無視されてしまうのでしょうか?それは、Railsがデータベースで使っている 「実行済みチェックリスト」 が原因です。

🏠 【例え話】家の工事と設計図

Railsのマイグレーションを、家を建てる時の作業に例えてみましょう。

要素 Railsでの名前 役割
設計図 マイグレーションファイル テーブルの作り方を書いたファイル
設計図番号 タイムスタンプ(20251212... 設計図を識別する固有の番号
家(建物) データベース 実際にデータが保存されている場所
チェックリスト schema_migrations テーブル 「どの設計図番号の工事が完了したか」を記録

仕組み

  1. あなたが最初に rails db:migrate を実行しました。
  2. Railsは設計図番号「20251212072223」の工事を行い、posts テーブルを作成しました。
  3. 工事が終わると、**「チェックリスト」**にこの番号を「実行済み(up)」として記録します。

❌ 編集後の再実行が無視される理由

あなたが設計図を修正した後、再度 rails db:migrate を実行しても、Railsは最初にこの「チェックリスト」を確認します。

  • 「あれ? 設計図番号 20251212072223 は、もうリストに載っていて up(完了) になっているぞ。じゃあ、やることはないな。」

このように判断されるため、どんなに設計図の中身を直しても、Railsはそれを開いてくれないのです。


3. 解決策:「ロールバック」でチェックリストを消す!

変更を反映させるには、「一度実行済みマークを消し、設計図を未実行状態に戻す」必要があります。これを行うのが ロールバック(Rollback) という機能です。

🛠️ 手順

ステップ 1: ロールバックで「やり直し」を宣言する

ロールバック実行前のステータスがこちら。
ロールバック実行前

ロールバックは、直前の migrate でやったことを取り消す命令です。

rails db:rollback

【何が起こるか】

  • データベースから、作成済みの posts テーブルが一時的に削除されます
  • 「チェックリスト」から、設計図番号 20251212072223 の「実行済みマーク」が削除されます(down状態に戻ります)

ロールバックを実行すると、実行ログが出ます。
ロールバック実行後

ステップ 2: 修正後の設計図で再実行する

ロールバックが完了したら、修正済みのマイグレーションファイルの内容で、もう一度 migrate を実行します。

rails db:migrate

【何が起こるか】

  • 今回はチェックリストに番号がないので、Railsは設計図を開き、新しい内容(locationtext カラムを含む)でテーブルを作り直します
  • 期待していた実行ログが表示されます!

マイグレート実行後


4. 【上級テクニック】実行済みファイルを直さないのが基本!

今回は急いでいたため設計図を直しましたが、今後の開発でトラブルを避けるために、覚えておいてほしい原則があります。

原則:一度実行したマイグレーションファイル(設計図)は触らない!

テーブルに項目を追加したり、変更したりしたい場合は、新しいマイグレーションファイルを常に作りましょう。

🆕 新しい項目を追加したい場合

  1. 新しいマイグレーションファイルを作成:
    # 例:postsテーブルに「title」という項目を追加する
    rails generate migration AddTitleToPosts title:string
    
  2. 新しいファイルで実行:
    rails db:migrate
    # 新しいファイルの実行ログだけが表示される
    

この方法なら、「チェックリスト」に新しい番号が追加されるだけで、過去のファイルは触らなくて済むため、安全です。

この記事が、あなたの開発の助けになれば嬉しいです!

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?