0
0

【Rails】データベースに反映済みのマイグレーションファイルの修正方法

Last updated at Posted at 2024-05-05

マイグレーションファイルを作成して, rails db:migrateし, あとからカラム名のタイポに気づきました

db/migrate/20240502121245_create_checkouts.rb
class CreateCheckouts < ActiveRecord::Migration[7.0]
  def change
    create_table :checkouts do |t|
      t.string :fisrt_name # first_name としたかった
      
      t.timestamps
    end
  end
end

rails db:migrateしていない場合は, そのままマイグレーションファイルを編集すればよいですが, すでにしている場合はデータベースに反映されているため, ロールバックをする必要があります。
反映されているかはrails db:migrate:statusで確認できます。upになっていれば反映済み, downになっていれば未反映です。

今回は以下のようにupになっていました。

$ rails db:migrate:status

database: myapp_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20230206140511  Create tasks
   up     20231230034411  Create items
   up     20231230085325  Create active storage tablesactive storage
   up     20240101065120  Add image name to items
   up     20240117124127  Add detail to items
   up     20240204060936  Remove image name from items
   up     20240310104030  Create carts
   up     20240311124017  Create cart items
   up     20240502121245  Create checkouts

このためロールバックをしました。以下のようにdownになりました。

$ rails db:rollback
== 20240502121245 CreateCheckouts: reverting ==================================
-- drop_table(:checkouts)
   -> 0.1274s
== 20240502121245 CreateCheckouts: reverted (0.2263s) =========================

$ rails db:migrate:status

database: myapp_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20230206140511  Create tasks
   up     20231230034411  Create items
   up     20231230085325  Create active storage tablesactive storage
   up     20240101065120  Add image name to items
   up     20240117124127  Add detail to items
   up     20240204060936  Remove image name from items
   up     20240310104030  Create carts
   up     20240311124017  Create cart items
  down    20240502121245  Create checkouts

これで修正可能です。マイグレーションファイルを以下のように修正しました。

db/migrate/20240502121245_create_checkouts.rb
class CreateCheckouts < ActiveRecord::Migration[7.0]
  def change
    create_table :checkouts do |t|
-      t.string :fisrt_name
+      t.string :first_name
      
      t.timestamps
    end
  end
end

修正したらrails db:migrateをしデータベースに反映されているか確認します。

$ rails db:migrate
== 20240502121245 CreateCheckouts: migrating ==================================
-- create_table(:checkouts)
   -> 0.1029s
== 20240502121245 CreateCheckouts: migrated (0.1037s) =========================

$ rails db:migrate:status

database: myapp_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20230206140511  Create tasks
   up     20231230034411  Create items
   up     20231230085325  Create active storage tablesactive storage
   up     20240101065120  Add image name to items
   up     20240117124127  Add detail to items
   up     20240204060936  Remove image name from items
   up     20240310104030  Create carts
   up     20240311124017  Create cart items
   up     20240502121245  Create checkouts

これで修正できました。

STEP=Xをつけたすことで, 任意のところまでロールバックできます
以下はorder_summaryモデルをあとから作成した状態です。

$ rails db:migrate:status

database: myapp_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20230206140511  Create tasks
   up     20231230034411  Create items
   up     20231230085325  Create active storage tablesactive storage
   up     20240101065120  Add image name to items
   up     20240117124127  Add detail to items
   up     20240204060936  Remove image name from items
   up     20240310104030  Create carts
   up     20240311124017  Create cart items
   up     20240502121245  Create checkouts
   up     20240507115607  Create order summaries

up 20240502121245 Create checkoutsのところまでロールバックする場合は以下のようになります

$ rails db:rollback STEP=2
== 20240507115607 CreateOrderSummaries: reverting =============================
-- drop_table(:order_summaries)
   -> 941.4622s
== 20240507115607 CreateOrderSummaries: reverted (941.5217s) ==================

== 20240502121245 CreateCheckouts: reverting ==================================
-- drop_table(:checkouts)
   -> 0.1185s
== 20240502121245 CreateCheckouts: reverted (0.1378s) =========================

最初のorder_summaryへのロールバックはご覧の通りかなり時間がかかりました
フリーズしたか?と思ってしまいました

$ rails db:migrate:status

database: myapp_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20230206140511  Create tasks
   up     20231230034411  Create items
   up     20231230085325  Create active storage tablesactive storage
   up     20240101065120  Add image name to items
   up     20240117124127  Add detail to items
   up     20240204060936  Remove image name from items
   up     20240310104030  Create carts
   up     20240311124017  Create cart items
  down    20240502121245  Create checkouts
  down    20240507115607  Create order summaries

2つdownにできました

参考

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