#はじめに
railsでアプリを作成していた際、db:migrateをした際に、エラーが発生しめmigrate:resetをしたのですがその際初めてのエラーが発生したので、その備忘録として書きたいと思います。
最初のエラー
新しくテーブルを作成するためにマイグレーションファイルを編集して実行したところファイル内に記述していたテーブル名に記述ミスがあり、エラーが発生しました。
class CreateHoges < ActiveRecord::Migration[5.2]
def change
create_table :hoges do |t|
t.references :huge
t.text :text
t.timestamps
end
add_foreign_key :hoges, :missname, column: :huge_id # missnameが記述ミス
end
end
そのため、記述を直し改めてマイグレーションファイルを実行したところ以下のエラーが発生しました。
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: table "hoges" already exists: CREATE TABLE "hoges"
どうやらテーブルは既に存在しているといって、エラーが起きているようです。
まさかと思いテーブルを確認しても出来ていません。
rails db:migrate:status で確認してもステータスは downになっていました。
原因
どうやらmigrationの際に、処理が途中まで進んで、残りでエラーが起きているときは、テーブルは生成されているけれどもテーブルを生成したmigrationは未実行のステータスになっていることがあるようです。
(create_tableのあと、add_foreign_keyしたところにエラーがあって、というパターン)
migrate:reset
ならば、一度データベースを全て削除した上で、再度実行したら直りそうです。
以下のコマンドを実行
rails db:migrate:reset
そしたら、またもやエラー
rake aborted!
ActiveRecord::NoEnvironmentInSchemaError:
Environment data not found in the schema. To resolve this issue, run:
bin/rails db:environment:set RAILS_ENV=development
なんだこれは、と思い調べたところ、どうやら指示されるようにコマンドを入力したら直りそうです。
以下の記事が、とても参考になります。
ActiveRecord::NoEnvironmentInSchemaErrorについて
解決
まず指示されるまま以下のコマンドを実行
rails db:environment:set
そして、再度以下のコマンドを。
rails db:migrate:reset
ようやく正常にテーブルを作成することができました。
おわり
今回はmigrate:resetで解決しましたが、もし他のテーブルに影響を与えない方法があるならば、教えていただければ幸いです。
最後まで読んでいただき、ありがとうございました。