マイグレーションファイルへの記述も終わらせて、いざマイグレーションしてテーブル作成しよう!と思った矢先の出来事である。
== 20200806043147 DeviseCreateUsers: migrating ================================
-- create_table(:users)
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)>'
!?
(※ユーザー名と作成中のアプリ名は伏せています)
ここでエラー文を確認
/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
「既に同じテーブルが存在してる事が原因?ならば一度削除するか。」
「そして再度マイグレーションしよう」
結果、同じエラー文が表示されるだけでした・・
その後も色々と試すが、結局どうにもならずにメンターさん(質問受け付け役の講師の様な人)とのオンライン相談へ…
メンターさんの指導の元、次のコマンドを順に試していく。
その後に再び、マイグレーションコマンドを入力した結果、変化が起きる!
% 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関連のエラーが初めから起きる訳である。これを書き換え、再度コマンドを実行していく。
そしてついに・・
% 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以前なら使い分けがあった様です。