✍️ DB反映済みのマイグレーションファイルを個別に修正する方法
はじめに
こんにちは、Takeです。都内の自社開発企業でエンジニアとして働いています。
この記事では、CreateAdmins
マイグレーションにおける password_digest
カラムに null: false
制約を追加する手順を詳しく解説します。
Rails
とDocker
を併用した環境でも対応できるよう、両方のコマンドを紹介しています。
現状のコードと修正内容
現在のCreateAdmins
マイグレーションファイルのコード
class CreateAdmins < ActiveRecord::Migration[7.1]
def change
create_table :admins do |t|
t.string :email, null: false
t.string :password_digest
t.timestamps
end
add_index :admins, :email, unique: true
end
end
修正依頼内容
password_digest
カラムに null: false
制約を追加してください。具体的には、以下のコードになります。
t.string :password_digest, null: false
マイグレーションの手順
次に、修正を反映するための手順を説明します。通常のコマンドと、Docker環境下でのコマンドを併記しますので、環境に応じて適切なコマンドを使用してください。
1. マイグレーションのステータス確認
まず、現在のマイグレーションのステータスを確認します。
rails db:migrate:status
docker compose run --rm web rails db:migrate:status
出力結果の例は以下の通りです。
Status Migration ID Migration Name
--------------------------------------------------
up xxxxxxxxxxxxxx Create admins
2. マイグレーションのロールバック
修正を行う前に、現在のマイグレーションをロールバックします。このとき、VERSION
引数を用いて特定のマイグレーションIDを指定することで、そのマイグレーションのみをロールバックできます。
これにより、admins
テーブルが削除され、マイグレーションのステータスが down
に戻ります。
rails db:migrate:down VERSION=Migration ID
docker compose run --rm web rails db:migrate:down VERSION=Migration ID
以下は、実行後のログの例です。
[+] Creating 1/0
✔ Container auto-registration-db-1 Running 0.0s
== xxxxxxxxxxxxxx CreateAdmins: reverting =====================================
-- remove_index(:admins, :email, {:unique=>true})
-> 0.0183s
-- drop_table(:admins)
-> 0.0253s
== xxxxxxxxxxxxxx CreateAdmins: reverted (0.0641s) ============================
Model files unchanged.
この操作により、特定のマイグレーションファイルだけを安全に修正することが可能です。
3. ロールバックの確認
マイグレーションファイルのステータスが down になっていることを確認します。
rails db:migrate:status
docker compose run --rm web rails db:migrate:status
出力結果は以下のようになります。
✔ Container auto-registration-db-1 Running 0.0s
database: app_development
Status Migration ID Migration Name
--------------------------------------------------
down xxxxxxxxxxxxxx Create admins
4. 修正したマイグレーションの再実行
修正を反映するために、再度マイグレーションを実行します。
rails db:migrate
docker compose run --rm web rails db:migrate
実行後のログの例です。
✔ Container auto-registration-db-1 Running 0.0s
== xxxxxxxxxxxxxx CreateAdmins: migrating =====================================
-- create_table(:admins)
-> 0.0091s
-- add_index(:admins, :email, {:unique=>true})
-> 0.0072s
== xxxxxxxxxxxxxx CreateAdmins: migrated (0.0164s) ============================
Model files unchanged.
5. 最終確認
念の為、マイグレーションファイルのステータスがup
になっているか確認
rails db:migrate:status
docker compose run --rm web rails db:migrate:status
出力結果が以下のようになっていれば、マイグレーションが正常に適用されています。
Status Migration ID Migration Name
--------------------------------------------------
up xxxxxxxxxxxxxx Create admins
まとめ
今回の手順では、password_digest
カラムに null: false
制約を追加するためのマイグレーション操作について説明しました。
マイグレーションの up
と down
は、データベースの変更を適用したりロールバックしたりするための重要なコマンドです。また、VERSION
引数を使用することで、特定のマイグレーションのみをロールバックできます。
最後に
ここまで読んでいただきありがとうございました!
今回の記事が良かったと思ったらぜひ「いいね」を押していただけると嬉しいです 🎉
noteでも記事を執筆していますので、ぜひチェックしてみてください。
他にもこのようなことについて記載しているのでお読みいただければ幸いです。
最後までお読みいただき、誠にありがとうございました!
Discussion