Railsアプリ生成時にデータベースを指定しなかったために、デフォルトのデータベース「SQLite3」を使用することになり、後々それをMySQLに変えようと思って、いざインストールする、となったときにハマってしまった話。
結果的に3夜かかっても、試行錯誤の成果が出ず、ついにRailseTechの先生に泣きついてヒントをもらったら、即時解決したというお話です。(先生ありがとう。嬉しいけど、複雑w)
ここでは、EC2にデプロイしたRailsアプリをそのままいじっているので、OSはAmazonLinux2。
まずは、mysql2のインストールから。
Gemfileを編集するためにvimで立ち上げる
vim Gemfile
「i」で編集モードにする。
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.7.2' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 6.1.1' # Use sqlite3 as the database for Active Record #gem 'sqlite3', '~> 1.4' # コメントアウト gem 'mysql2' # 追加 # Use Puma as the app server gem 'puma', '~> 5.0' # --- 以下略
Escキーでニュートラルモードに戻してから、「:wq」で上書き保存でvimモード終了
mysql2をインストールする
bundle install
インストールできた
マイグレートする
rails db:migrate
次のようなエラーが出る
rails aborted!
LoadError: Error loading the 'mysql2' Active Record adapter. Missing a gem it depends on? can't activate mysql2 (~> 0.5), already activated mysql2-0.4.10. Make sure all dependencies are added to Gemfile.
Gemfileは、mysql2のバージョンを指定していないので、最新の0.5.3が取得されるはずだが、0.4.10になっている?
Gemfile.lockを見ると、確かに0.4.10でロックされている。
Gemfileにバージョン指定してみたらどうだろうか?
gem 'mysql2', '~> 0.5.3'
再び、bundle installを実行してみる
Bundler found conflicting requirements for the Ruby version:
In Gemfile:
Ruby (~> 2.7.2.0)
mysql2 (~> 0.5.3) was resolved to 0.5.3, which depends on
Ruby (< 2.7.dev, >= 2.2) x64-mingw32
mysql2の0.5.3を使う場合は、Rubyのバージョンは2.7未満(つまり2.6.x)でなければいけないらしい。
仕方ない。Rubyのバージョンを落とすか。
rbenvはもともとEC2にインストールしてあったので、下記コマンドで使えるRubyのバージョンを確認
rbenv install --list
2.7未満の最新は、2.6.6なので、そこまでバージョンを下げる
rbenv install 2.6.6
インストールには若干時間がかかるので、いささか不安になるww(5分くらいかかる)
インストール完了したので、確認
今回インストールした、2.6.6をsample_apiプロジェクトに適用したいので、
rbenv local 2.6.6
rbenv versionsで確認。OK
これで、mysql2(0.5.3)を使う準備が整った。
Gemfileのrubyバージョンを書き換える
# ruby '2.7.2' コメントアウト ruby '2.6.6' # 追加
再度、bundle install
やや?!エラーが出た
Could not find 'bundler' (2.1.4) required by your /home/ec2-user/sample_apl/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.1.4`
bundlerの2.1.4をインストールせよとあるので、素直に従う
gem install bundler:2.1.4
bundle updateをしてから、bundle install
ようやく環境が整った。
色々とインストールするときに、最新版は置いておいて、とりあえず安定版を入れればOK!と思っていたら、こんなところで躓いてしまった。
mysql2のバージョンとrubyのバージョンに依存関係があるということを知っているか知らないか問題、という感じがする。
自分で色々調べていた時に、各gemのバージョンに関係があるらしいという情報は、目にしてはいたものの、rubyは最新版の3.0.0じゃなくて安定板の2.7.2を入れているんだから、大丈夫じゃね?という根拠のない自信が、今回ハマった一番の原因のような気がする。
全てを疑ってかかる、これ大事。