はじめに
これは学習用のメモになります。
今回は$rails db:migrate、または、$rails db:migrateを行った後のエラーが出た時の対処をしていきます。
== 20200107095832 CreateMicroposts: migrating =================================
-- create_table(:microposts)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: table "microposts" already exists: CREATE TABLE "microposts" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "content" text, "user_id" integer, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL)
以下つづく
原因
この前に行ったコマンドのmigrationで何らかの手違いがあると思います。おそらく、migration処理の途中からエラーが起きていて、テーブルは生成されているが、テーブルを生成したmigrationは未実行のまま。といった状態なのかな?と思います
解決策
①
$ rails db:migrate:reset
データベースのリセットを行った後
$ rails db:migrate
もう一度マイグレーション
データベースを削除し、新しくmigrationファイルを修正して、もう一度migrationを行いたい場合に使うコマンドです。
②
$ rails db:migrate:reset
データベースのリセットを行った後エラーが発生!
ActiveRecord::NoEnvironmentInSchemaError:
Environment data not found in the schema. To resolve this issue, run:
bin/rails db:environment:set RAILS_ENV=development
Tasks: TOP => db:migrate:reset => db:drop => db:check_protected_environments
(See full trace by running task with --trace)
### 対処
rake db:migrate:status
上記のコマンドでdbのステータスを確認します。
⬇︎実行内容
up 20201013130002 Devise create users
down 20201015132219 Add devise to users
どうやら、一番下のマイグレーションファイルが怪しい。。。
エディタを確認したところ
同じマイグレーションファイルを二回作成していました。。
なので、一番下のマイグレーションファイルを削除してみます。
※downの状態だったら、手動でファイルを削除しても問題ない
$ rm -rf db/migrate/20201015132219_add_devise_to_users.rb
これでもう一度マイグレーションを行う。
⬇︎実行結果
== 20201013130002 DeviseCreateUsers: migrating ================================
-- create_table(:users)
-> 0.0061s
-- add_index(:users, :email, {:unique=>true})
-> 0.0014s
-- add_index(:users, :reset_password_token, {:unique=>true})
-> 0.0011s
== 20201013130002 DeviseCreateUsers: migrated (0.0087s) =======================
問題なくできました!
最後に
今回はマイグレーションした際のエラーについて学習しました。
DBリセットしても解決しませんでした。
原因はマイグレーションファイルが重複していたためでした。
間違っているところがあればご指摘いただけると幸いです。