マイグレーションの状況の確認
db:migrateは、クエリを打ってデータベースを直接操作するようなことなく、migrationfileに記述された仕様の通りにデータベースのスキーマを設定できる処理のこと。
db:migrateが実行されると、migrationfileはそのバージョンに基づくIDにより管理されることになる。そのため、既存のmigrationfileの内容を変更して、再度db:migrateを実行しても、同じIDのmigrationfileによるマイグレーションが既に実行されている場合、変更内容は反映されない。
まず、現在のマイグレーションの状況を確認するため、以下を実行する。
$ rails db:migrate:status
すると例えば以下のようなマイグレーションの状況が出力される。
Status Migration ID Migration Name
--------------------------------------------------
up 20221016090215 Devise create users
up 20221030072844 Add user id to users
ちなみにマイグレーションファイルの内容は以下のような感じになっている。
# 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
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を一つにまとめておく。
# 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を実行する。
$ rails deb:migrate:redo
再度、マイグレーションの状況を確認すると、
Status Migration ID Migration Name
--------------------------------------------------
up 20221016090215 Devise create users
のように出力され、変更内容が反映される。