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の中身を空にします。
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