0
0

More than 1 year has passed since last update.

【Rails】マイグレーションの変更内容の反映

Last updated at Posted at 2022-11-06

マイグレーションの状況の確認

db:migrateは、クエリを打ってデータベースを直接操作するようなことなく、migrationfileに記述された仕様の通りにデータベースのスキーマを設定できる処理のこと。
db:migrateが実行されると、migrationfileはそのバージョンに基づくIDにより管理されることになる。そのため、既存のmigrationfileの内容を変更して、再度db:migrateを実行しても、同じIDのmigrationfileによるマイグレーションが既に実行されている場合、変更内容は反映されない。

まず、現在のマイグレーションの状況を確認するため、以下を実行する。

terminal
$ rails db:migrate:status

すると例えば以下のようなマイグレーションの状況が出力される。

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20221016090215  Devise create users
   up     20221030072844  Add user id to users

ちなみにマイグレーションファイルの内容は以下のような感じになっている。

20221016090215_devise_create_users.rb
# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|

      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      t.datetime :remember_created_at

      t.timestamps null: false
    end

    add_index :users, :email
    add_index :users, :reset_password_token, unique: true
  end
end
20221030072844_add_user_id_to_users
class AddUserIdToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :user_id, :string
    add_index :users, :user_id, eunique: true
  end
end

マイグレーションのredo

マイグレーションをやり直すにはrails db:migrate:redoを実行する。この処理は、マイグレーションのステータスを一度downにしてから、再度upにするもので、migrationfileの変更内容を反映させることができる。
rails db:rollbackを実行し、rails db:migrateを実行しても同様。)

その前に、二つに分かれているmigrationfileを一つにまとめておく。

20221016090215_devise_create_users.rb
# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|

      t.string :email,              null: false, default: ""
      t.string :user_id,             null: false
#今回は、user_idにnull:falseを付け加えることを変更点として、マイグレーションをredoする
      t.string :encrypted_password, null: false, default: ""

      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      t.datetime :remember_created_at

      t.timestamps null: false
    end

    add_index :users, :email
    add_index :users, :user_id, eunique: true
    add_index :users, :reset_password_token, unique: true
  end
end

もう一つのmigrationfileについては、以下のコマンドを実行して、downさせる。

$ rails deb:migrate:down VERSION=20221030072844

再度ステータスを見てdownになっていることを確認し、ファイルを削除しておく。
(downする前に削除すると、もう一度ファイルを作ってからdownさせ、削除するという手間が生じる。)
その上で、redoを実行する。

terminal
$ rails deb:migrate:redo

再度、マイグレーションの状況を確認すると、

Status   Migration ID    Migration Name
--------------------------------------------------
   up     20221016090215  Devise create users

のように出力され、変更内容が反映される。

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