ケースタディ!

プログラミングやITに関する知識、私なりの様々な学習方法、読書感想などを綴っていきます!

(Ruby on Rails)「rails db:migrate」でエラーが起きた話とその解決策 (all later migrations canceled:!? Error: Table 'users' already exists??)

マイグレーションファイルへの記述も終わらせて、いざマイグレーションしてテーブル作成しよう!と思った矢先の出来事である。

%******@MacBook ******App % rails db:migrate
== 20200806043147 DeviseCreateUsers: migrating ================================
-- create_table(:users)
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Table 'users' already exists
/Users/******/projects/******App/db/migrate/20200806043147_devise_create_users.rb:5:in `change'
/Users/******/projects/******App/bin/rails:9:in `<top (required)>'
/Users/******/projects/******App/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'

!?

(※ユーザー名と作成中のアプリ名は伏せています)

ここでエラー文を確認

/Users/******/projects/CreatingApp/bin/rails:9:in `<top (required)>'
/Users/******/projects/CreatingApp/bin/spring:15:in `<top (required)>'

binディレクトリ?いやいや、一度も触ってないし問題はここではないな。」

Mysql2::Error: Table 'users' already exists

「既に同じテーブルが存在してる事が原因?ならば一度削除するか。」

% rails db:migrate:reset

「そして再度マイグレーションしよう」

% rails db:migrate

結果、同じエラー文が表示されるだけでした・・

 

その後も色々と試すが、結局どうにもならずにメンターさん(質問受け付け役の講師の様な人)とのオンライン相談へ…

メンターさんの指導の元、次のコマンドを順に試していく。

% rails db:drop
% rails db:create

その後に再び、マイグレーションコマンドを入力した結果、変化が起きる!

% rake db:migrate
== 20200806043147 DeviseCreateUsers: migrating ================================
-- create_table(:users)
-> 0.0107s
-- add_index(:users, :email, {:unique=>true})
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Specified key was too long; max key length is 767 bytes
/Users/******/projects/*******App/db/migrate/20200806043147_
devise_create_users.rb:48:in `change'

新たなエラー文が出現!

Mysql2::Error: Specified key was too long; max key lengths is 767 bytes

これを見たメンターさんから一言「configディレクトリ内のdatabase.ymlファイルを調べましょう!

そしてdatabase.ymlファイル内を参照した結果が以下である。            

default: &default
adapter: mysql2
encoding: utf8mb4
 
メンターさんencodingに設定されている文字コードがおかしいですねutf8mb4からutf8へと書き変えましょう!

mysql2関連のエラーが初めから起きる訳である。これを書き換え、再度コマンドを実行していく。

% rails db:create

そしてついに・・

% rake db:migrate
== 20200806043147 DeviseCreateUsers: migrating ================================
-- create_table(:users)
-> 0.0088s
-- add_index(:users, :email, {:unique=>true})
-> 0.0086s
-- add_index(:users, :reset_password_token, {:unique=>true})
-> 0.0066s
== 20200806043147 DeviseCreateUsers: migrated (0.0242s) =======================

   Congratulation!

無事にマイグレーションが完了し、テーブルにカラムが反映される!

つまり、エラーの原因を特定する上で私に足りなかったことは「途中でrails db:dropコマンドを試すこと」「database.ytmの設定を忘れていた&それに気づかなかったこと」ですね。今後も私が遭遇したエラー内容はこのブログを通して共有していきます。同じエラーで躓いてしまった方へ少しでも参考になれれば光栄です。

[余談]

今回の件に関して様々なサイトを調べる中で、上記のターミナル上で使われている「rails db:migrate」を「rake db:migrate」と記述されて居られたサイトもいくつかございました。

railsとrakeの違いって何だろう」と思って調べた結果、下のQ&Aサイトに行き着きました。

teratail.com

こちらのご回答によりますと、「Rails 5以降なら、railsとrakeのどちらのコマンドも同じ」と考えても良いそうですね。Rails 4以前なら使い分けがあった様です。

f:id:keisuke-studyingIT:20200806174008p:plain