0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Railsでmigrationかけた後にブランチをチェックアウトしてしまった時の復旧方法

Last updated at Posted at 2022-06-06

rails db:migrate掛けたことを忘れて、新ブランチにチェックアウトした後
既にテーブルが作成されていることからmigrateができなくなってしまった時の復旧方法

まず、migrateしてしまった時のブランチにチェックアウトします。

そして以下のコマンド

rails db:migrate:status

そうするとこうなっているはず。

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220606000001  Create hoge
   up     20220606000002  ********** NO FILE **********
  down    20220606000003  Create fuga

********** NO FILE **********
これはmigrate した後にコミットしなかったことで、存在しないファイルがmigrateされているということ。

このNO FILEをrollbackさせるときは、同じタイムスタンプのmigarteファイルを作成して、changeの中身を空にします。

20220606000002_piyo.rb
class Piyo < ActiveRecord::Migration[6.0]
  def change
  end
end

そしてrollbackします。

rails db:rollback

これでチェックアウト前の、間違ってmigarteしたブランチの復旧は完了。

そして問題は、新ブランチ。
ここでもチェックアウト前にmigrateした過去を引き継いでいるので、テーブルが作成されていた。

そのテーブルが存在していることにより、migrate上ではdownになっているが、DBにtableが存在しているためmigrateができない状態となっていた。

なので、MySQLに入ってtableをdropする必要がある。

rails db:
# これでMySQLに入る
Enter password:

パスワードはdockerを使用していればdocker-compose.ymlに記載があるはず。
パスワード入力したら以下を実行

MySQL [hoge]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| hoge_app           |
| hoge_app_test      |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

dbを選択する。おそらく他の環境でもhoge_appだと思う、

MySQL [hoge]> SHOW TABLES FROM hoge_app;
+-------------------------------+
| Tables_in_hoge_app            |
+-------------------------------+
| user                          |
| post                          |
| company                       |
| etc...                        |

色々テーブルがあると思うが、今回dropしたいテーブルがcompanyであれば、以下のコマンドで削除する。
MySQL [hoge]> DROP TABLE db名.table名;

MySQL [hoge]> DROP TABLE hoge_app.company;

この際、自分の環境では以下のエラーが発生した。

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

どうやらforeign keyが消せないぽい。
これは調べたところによると、一旦foreign keyの設定をOFFにすることで回避できるらしい。

mysql> SET FOREIGN_KEY_CHECKS = 0;
Query OK, 0 rows affected (0.01 sec)

OKが出たら、再度tableをdropする。

MySQL [hoge]> DROP TABLE hoge_app.company;
Query OK, 0 rows affected (0.03 sec)

これで、companyテーブルは消えている。

MySQL [hoge]> SHOW TABLES FROM hoge_app;
+-------------------------------+
| Tables_in_hoge_app            |
+-------------------------------+
| user                          |
| post                          |
| etc...                        |

そしたら、foreign keyの設定を元に戻す。

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.01 sec)

ここで無事、migrateが通るはず。

MySQL [hoge]> exit
Bye

rails db:migrate

お疲れ様でした。
以下、参考にさせていただいた記事です。ありがとうございます。

コード上では問題なくても、railsではmigrationを記憶しているので
こういった作業が必要になるわけですね。

次回からブランチを切る時は気をつけたいと思います。

参考:
https://qiita.com/r_sk00002/items/9bf321f81d3b84042694
https://qiita.com/YotaHamasaki/items/4f94dde7dcce4f01f209
https://proengineer.internous.co.jp/content/columnfeature/6745#section700

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?