LoginSignup
0
0

More than 1 year has passed since last update.

ActiveRecord::PendingMigrationError

Posted at

ActiveRecord::PendingMigrationError

You have 2 pending migrations:
2件の保留中のmigrationファイルがある。
→rails db:createは終わっているが、rails db:migrateしていないでしょと言われている。何をrails db:migrateしていないのかを確認するために

rails db:migrate:statusを行う


migrationは、SQL文を書かずにデータベースの構造を変更したり、元に戻したりできる

実行後の内容
Status Migration ID Migration Name

up 20220815060217 ********** NO FILE **********
up 20220815060220 ********** NO FILE **********
up 20220815073501 ********** NO FILE **********
down 20220815144028 Devise create admin users
down 20220815144031 Create active admin comments

Status欄に「up」と表示されているmigrationファイルは、データベースに適用済みです。
一方、Status欄に「down」と表示されているmigrationファイルは適用されていません。

migrationファイルが増えてきたり、up/downで編集することが多くなったときは、再現性(冪等性:べきとうせい)を確認する。
再現性を確認するためには、データベースを一度削除してから、すべてのmigrationファイルを適用して、実行結果を確認すれば良い。
データベースを一度削除したり再適用したりといった作業が大変そうなイメージですが、railsではbin/rails db:migrate:resetコマンドを実行するだけです。

rails db:migrate:resetを行ったあと

Running via Spring preloader in process 91209

database: active_admin_sample_development

Status Migration ID Migration Name

up 20220815144028 Devise create admin users
up 20220815144031 Create active admin comments

再度rails sを実行すると
エラーが解消され、正常に起動した。

以下
https://qiita.com/Jwataru/items/78074acc463620a2311a
の引用

三つのパターン
1.単純にrails db:createのあとrails db:migrateし忘れている
マイグレーション実行の下記のコマンドを打ち込みましょう
$ rails db:migrate


2.すでにmigrationが完了している(up)状態でマイグレーションファイルを更新しrails db:migrateしてしまった
方法1 既存のテーブルを全削除し、再度マイグレーションの状態をupにする下記のコマンドを打ち込みましょう
$ rails db:migrate:reset

方法2(未実施) マイグレーションの最新のものだけ実行を取りやめて編集可能(down)にするコマンドrails db:rollbackののち、マイグレーションファイルの更新コマンドrails db:migrateを打ちましょう

$ rails db:rollback
$ rails db:migrate

※マイグレーションの状態を調べるコマンドは下記の通りです

$ rails db:migrate:status


3,マイグレーションファイルの中に入れた外部参照キーが参照するテーブルがない状態でrails db:creatしてしまった
①-1外部参照されるマイグレーションファイルを作成し、app/modelの中のファイルにアソシエーションを追記(または修正)する
①-2マイグレーションファイルから不必要な外部参照キーを消す
②上記①のどちらかの修正のあとに下記コマンドを打ち込みましょう
$ rails db:migrate:reset

4,すでにデータベースにレコードを入れてしまい、それを残したまま修正する方法(補足)
新たに追加したい項目のテーブルを作成し、本来追加したかったテーブルのidを外部キーとする方法をとりましょう。

こちらに助けられました。ありがとうございます。

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