🧻

✍️ DB反映済みのマイグレーションファイルを個別に修正する方法

2024/08/21に公開

はじめに

こんにちは、Takeです。都内の自社開発企業でエンジニアとして働いています。

この記事では、CreateAdmins マイグレーションにおける password_digest カラムに null: false 制約を追加する手順を詳しく解説します。

RailsDockerを併用した環境でも対応できるよう、両方のコマンドを紹介しています。

現状のコードと修正内容

現在のCreateAdminsマイグレーションファイルのコード

db/migrate/date_create_admins.rb
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 制約を追加するためのマイグレーション操作について説明しました。

マイグレーションの updown は、データベースの変更を適用したりロールバックしたりするための重要なコマンドです。また、VERSION 引数を使用することで、特定のマイグレーションのみをロールバックできます。

最後に

ここまで読んでいただきありがとうございました!
今回の記事が良かったと思ったらぜひ「いいね」を押していただけると嬉しいです 🎉

noteでも記事を執筆していますので、ぜひチェックしてみてください。
https://note.com/take_lifelog/n/n58df7ce7af6f

他にもこのようなことについて記載しているのでお読みいただければ幸いです。

https://zenn.dev/take_tech/articles/275e5f4242973d

https://zenn.dev/take_tech/articles/374817f256ec9d

最後までお読みいただき、誠にありがとうございました!

Discussion