##記事の目的
rails db:migrateでマイグレーションできない問題に対しての対処法を共有すること。
状況
モデル作成時に
rails g model posts
のようにpost
としなければならないところを複数形で書いてしまったため、一度削除した。その後、rails g model post
でモデルを作りrails db:migrate
をしたところ、
ActiveRecord::PendingMigrationError
というエラーが発生。
(もしかしたら削除後にbundle exec rails db:migrate
を行なっていなかったことが原因の可能性あり。)
対処法
###ActiveRecord::PendingMigrationErrorって何?
簡単にいうと、未実行のmigrationがある場合に出てくるエラー。
自分の場合はrails db:migrate
をしても解決しなかったのでデータベースをいじってみることにした。
###最初に試したこと
マイグレーションがcreatできてないと考え、まずはデータベースの中を$ rails dbconsole
のあと確認。
MySQL [app_development]> SHOW TABLES;
+---------------------------+
| Tables_in_app_development |
+---------------------------+
| ar_internal_metadata |
| schema_migrations |
+---------------------------+
2 rows in set (0.00 sec)
MySQL [app_development]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| app_development |
| app_test |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.01 sec)
postテーブルはない...。
でもrails db:createは実行されている。
###対処できた処理
ここで、schema_migrationsをみてみる。
MySQL [app_development]> SELECT * FROM schema_migrations;
+----------------+
| version |
+----------------+
| 20200202112028 |
+----------------+
1 row in set (0.00 sec)
####schema_migrationsとは!?
Railsのschema_migrations
はどのマイグレーションスクリプトまで実行済みなのかを記録するためのテーブル。
つまり、今回は実際にテーブルには反映されていないけどRailsは作ったよと言い張っている感じ。
このファイルがあると新しくモデルを作るときに邪魔なので削除する。
MySQL [app_development]> DELETE FROM schema_migrations WHERE VERSION=20200202112028 ;
Query OK, 1 row affected (0.06 sec)
確認すると、
MySQL [app_development]> SELECT * FROM schema_migrations;
Empty set (0.00 sec)
空になっている!!!!
exit
で抜けてrails db:migrate
すると、
== 20200202112028 CreatePosts: migrating ======================================
-- create_table(:posts)
-> 0.2196s
== 20200202112028 CreatePosts: migrated (0.2264s) =============================
となり無事作成することができた!
終わりに
データベースでおかしいことがあればSHOW
などで中身を見る癖をつければトラブルシューティングになりそう!
おかしなところがあればフィードバックをください!