LoginSignup
4
4

More than 3 years have passed since last update.

【Rails】マイグレーションファイルやschemaファイルの仕組み、rails db:migrate、rails db:rollbackとかを纏めてみた

Last updated at Posted at 2020-04-07

マイグレーションファイルとは?

マイグレーションファイルとはデータベースの設計図のことです。

このマイグレーションファイルをどのように作成して、データベースに反映させるのか、
また、一度データベースに反映させた内容をどのように修正できるのか、自分なりに纏めてみました。

マイグレーションファイルを作成し、データベースに反映させる

まずはターミナルでマイグレーションファイル(DBの設計図)を作成します。
僕の場合、text型のbodyカラムを持つ、BoardモデルとUserモデのマイグレーションファイルを作成しました。

まずはreference型にboard_id:referencesuser_id:referencesと間違った内容を付けたとします。

# 誤った内容であることに注意!
$ rails g model comment body:text board_id:references user_id:references

これによって、以下のマイグレーションファイルが作成される。

db/migrate/20200330045356_create_comments.rb
# 誤ったファイルであることに注意!
class CreateComments < ActiveRecord::Migration[5.2]
  def change
    create_table :comments do |t|
      t.text :body, null: false
      t.references :board_id, foreign_key: true
      t.references :user_id, foreign_key: true

      t.timestamps
    end
  end
end

このマイグレーションファイルを作成した段階では、データベースに反映されていません。
ターミナルで下記のrails db:migrateコマンドを実行すると、作成したマイグレーションファイルが読み込まれ、データベースに反映されます。

$ rails db:migrate
== 20200330045356 CreateComments: migrating ===================================
-- create_table(:comments)
   -> 0.0143s
== 20200330045356 CreateComments: migrated (0.0165s) ==========================

データベースに反映されているマイグレーションファイルを確認する

そして、rails db:migrate:statusを実行すると、DBに反映されたマイグレーションファイルを確認できます。
upと書いているファイルがデータベースに反映されているもの(マイグレーション済みということ)です。

$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200310093526  Sorcery core
   up     20200316101344  Create boards
   up     20200316105948  Add user id to boards
   up     20200328064702  Add board image to board
   up     20200330045356  Create comments

次に、スキーマファイルで現在のデータベースの構造を確認できるのですが、
下記のcommentsテーブルはboard_id_iduser_id_idと誤ったカラムが追加されているので、修正したいです。

db/schema.rb
# 誤ったテーブル内容
create_table "comments", force: :cascade do |t|
    t.text "body", null: false
    t.integer "board_id_id"
    t.integer "user_id_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["board_id_id"], name: "index_comments_on_board_id_id"
    t.index ["user_id_id"], name: "index_comments_on_user_id_id"
  end

データベース及びマイグレーションファイルの修正方法

まずは、rails db:rollbackで最新のマイグレーションファイルをdown状態にします。
down状態のマイグレーションファイルは、データベースに反映されていない状態にあるということです。
(up状態にあるマイグレーションファイルを削除・編集することは避けましょう)

$ rails db:rollback

== 20200330045356 CreateComments: reverting ===================================
-- drop_table(:comments)
   -> 0.0044s
== 20200330045356 CreateComments: reverted (0.0079s) ==========================

rails db:migrate:statusで、以下の様にdown状態になったことが確認できますね。

$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200310093526  Sorcery core
   up     20200316101344  Create boards
   up     20200316105948  Add user id to boards
   up     20200328064702  Add board image to board
  down    20200330045356  Create comments

次に行う手順として、2通り方法があります。
①down状態にしたマイグレーションファイルを削除し、新しいマイグレーションファイルを作成してから、rails db:migrateする。
②down状態にしたマイグレーションファイルを直接編集し、rails db:migrateする。

どちらでもいいのですが、今回はカラム名を修正するだけなので、②の方法を取ってみます。
board_idboardに、user_iduserに変更します。

db/migrate/20200330045356_create_comments.rb
# 誤ったファイルであることに注意!
class CreateComments < ActiveRecord::Migration[5.2]
  def change
    create_table :comments do |t|
      t.text :body, null: false
      t.references :board, foreign_key: true
      t.references :user, foreign_key: true

      t.timestamps
    end
  end
end

これでrails db:migrateすると、マイグレーションファイルがup状態に戻ります。

$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200310093526  Sorcery core
   up     20200316101344  Create boards
   up     20200316105948  Add user id to boards
   up     20200328064702  Add board image to board
   up     20200330045356  Create comments

スキーマファイルを確認すると、

db/schema.rb
create_table "comments", force: :cascade do |t|
    t.text "body", null: false
    t.integer "board_id"
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["board_id"], name: "index_comments_on_board_id"
    t.index ["user_id"], name: "index_comments_on_user_id"
  end

無事、正しいカラム名を持ったテーブルがデータベースに反映されました!

まとめ

最後に、ここまでの内容をまとめておきます!

  • マイグレーションファイルとはデータベースの設計図のこと。
  • rails g model モデル名 カラム名:型で、モデルとマイグレーションファイルを作成する
  • rails db:migrateで、マイグレーションファイルをDBに反映させる(up状態)
  • rails db:rollbackで、マイグレーションファイルをDBに反映させる前の状態に戻す(down状態)
  • rails db:migrate:statusで、各マイグレーションファイルのDBへの反映状態(up,down)を確認できる
  • マイグレーションファイルの修正方法は、①down状態にしたマイグレーションファイルを削除し、新しいマイグレーションファイルを作成してから、rails db:migrateする。もしくは、 ②down状態にしたマイグレーションファイルを直接編集し、rails db:migrateする。
4
4
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
4
4