👀

Windows を使っている皆さんへ ~Rails + MySQL の gem インストールエラー 私はこうして解消できました~

2024/03/16に公開

はじめに

 私は、3 ヶ月ほど前にプログラミングを学習し始めた初心者です。Rails のデータベース(デフォルトだと SQLite3)を MySQL に設定して使いたいと思って

ターミナル
rails new アプリ名 -d mysql
# または
rails new アプリ名 --database=mysql

とターミナル上で入力し、様々なエラーと闘い続けてきました…。
そしてついに今、Rails で MySQL を使うことに成功したのです!!!!!!

バージョン情報

  • Windows 11 Home
  • ruby 3.2.3
  • Rails 7.1.3.2
  • MySQL 8.0.36
  • gem mysql2 0.5.6

目次(エラーの壁)

 私の身に起きた全エラーを目次として、順番に突破していった過程を解説します。

  1. Gem Load Error is: Incorrect MySQL client library version! This gem was compiled for 10.8.8 but the client library is 3.3.8.

  2. undefined method `split' for nil:NilClass (NoMethodError)

  3. bin/rails aborted!LoadError: 126: 指定されたモジュールが見つかりません。 - C:/tools/ruby/Ruby32-x64/lib/ruby/gems/3.2.0/gems/mysql2-0.5.6/lib/mysql2/mysql2.so (LoadError)

  4. Mysql2::Error::ConnectionError: SSL connection error: unknown error number (Mysql2::Error::ConnectionError)

------ここからはおまけです----------

  1. Mysql2::Error::ConnectionError: Access denied for user 'root'@'localhost' (using password: NO) (Mysql2::Error::ConnectionError)

1. Gem Load Error is: Incorrect MySQL client library version! This gem was compiled for 10.8.8 but the client library is 3.3.8.

  「gem が 10.8.8 に対応しているのに、クライアントライブラリのバージョンが 3.3.8 だから、YOU たち互換性がないよ HAHAHA!!」

きっと、こんな風に言われているのだろうと思います。

このエラーは、こちらの記事を読んでその通りに進めていくと、二度と吐かれなくなりました!!

https://tech-popeye.com/ruby-on-rails-mysql-windows/

第 1 のエラー、突破!!

2. undefined method `split' for nil:NilClass (NoMethodError)

 Rails ならではのエラー文な気がします!Nil クラスの nil オブジェクトを参照してしまっている状態だと思われますが、このエラーも

https://tech-popeye.com/ruby-on-rails-mysql-windows/

こちらの記事通りに、Connector/C をダウンロードして mysql2 をインストールした後、lib ディレクトリにある libmysql.dll ファイルを Ruby の bin ディレクトリの libmariadb.dll ファイルと置き換えることで、解消することができました!

第 2 のエラー、突破!!

3. bin/rails aborted!LoadError: 126: 指定されたモジュールが見つかりません。 - C:/tools/ruby/Ruby32-x64/lib/ruby/gems/3.2.0/gems/mysql2-0.5.6/lib/mysql2/mysql2.so (LoadError)

 前述 1,2 で紹介した記事通りに進めていると、私と同じパス設定になっているかと思います!このエラーは、bundle install までは成功したにも関わらず

ターミナル
rails db:create

これを実行した際に吐かれたエラー文です。ただ、そのパスの通り、実際のフォルダをもぐって見に行ってみると…

 ありますやん!!!

そうです。ファイルは、あるのです。つまり、原因はこちらだったのです。

 すみません。database.yml にパスワード入力するの忘れていました…

パスワードべた打ちして、第 3 のエラー、突破!!

4. Mysql2::Error::ConnectionError: SSL connection error: unknown error number (Mysql2::Error::ConnectionError)

 パスワードをベタ打ちして

ターミナル
rails db:create

をしたところ、今度は見出しのようなエラーが…。これについては、

https://stackoverflow.com/questions/65215783/ruby-on-rails-5-2-0-mysql2errorconnectionerror-ssl-connection-error-unknown

こちらの記事を読みました、結論としては

この 2 行を、database.yml の default に追記すれば、解消されました!

 さぁ…。これで、

ターミナル
rails db:create

してみてください。きっと、エラーを吐かれることなく、「Created database」とターミナルに出るはずです!!

第 4 のエラー、突破!!

 おめでとうございます! ここまでで、もう Rails で MySQL データベースを使える状態になっています!!

5. Mysql2::Error::ConnectionError: Access denied for user 'root'@'localhost' (using password: NO) (Mysql2::Error::ConnectionError)

 ここからは、おまけ要素が強いです。

何をしているかというと、

ここにパスワードをベタ打ちしたままの状態だと、GitHub にプッシュした際に、設定したパスワードが見られ放題になってしまうという懸念がありますよね。

 そこで、パスワードを別ファイルに書いて変数に代入し、この database.yml にはその変数を呼び出す形式で記入することで、パスワードを直接第三者に見られることがない書き方にしようと試みました!

 見出しのエラー文は、その過程でミスをして、吐かれたやつです…。

手順(この後詳しく解説します)

  1. .env ファイルをルートディレクトリに作成する
  2. Gemfile に「gem 'dotenv-rails'」を追記する
  3. MySQL を起動して、書き換える ← ここでミスすると見出しのエラー文登場
  4. database.yml ファイルの password を書き換える

1. .env ファイルをルートディレクトリに作成

 プロジェクトのルートディレクトリに、「.env」という名前のファイルを作成します。このファイルは、環境変数を管理するファイルとして扱い、Rails プログラムから参照できるようにすることで、このファイルに書いた変数を利用することができるようになります。

.env
PASSWORD = "password12345"

 先ほどベタ打ちした、MySQL のルートパスワードを、PASSWORD という変数名(任意)に代入します。このとき、変数名は全て大文字で記入するようにしましょう。

2. Gemfile に「gem 'dotenv-rails'」を追記

 以下の記事が参考になりました。

https://zenn.dev/goldsaya/articles/8614854f00bb98

 先ほどの.env ファイルを Rails から参照できるようにするための gem をインストールします。Gemfile に

Gemfile
gem 'dotenv-rails'

と追記して、

ターミナル
bundle install

を実行しましょう。

3. MySQL を起動して書き換え

 ターミナル上で、MySQL を起動します

ターミナル
mysql -u root -p
# この後、設定したパスワードを入力します

 MySQL を起動させた後

mysql
SELECT User, Host, Plugin FROM mysql.user;

と入力すると、

User Host Plugin
mysql.infoschema localhost caching_sha2_password
mysql.session localhost caching_sha2_password
mysql.sys localhost caching_sha2_password
root localhost caching_sha2_password

このような表が出力されると思います。この表を確認したら、

mysql
ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY 'password12345';

上記のように入力します。最後のクォーテーションの中には、手順 2 で書いた MySQL のルートパスワードを書きます。(つまり、database.yml にベタ打ちしていたパスワードをここにも書くという感じです。)

 再び

mysql
SELECT User, Host, Plugin FROM mysql.user;

と入力して表を確認してみると、

User Host Plugin
mysql.infoschema localhost caching_sha2_password
mysql.session localhost caching_sha2_password
mysql.sys localhost caching_sha2_password
root localhost mysql_native_password

右下の Plugin の言葉だけが、変わっていると思います。
ここまで来れば、ゴールは目前です!

4. database.yml ファイルの password 書き換え

 いよいよ最後の仕上げです。database.yml ファイルを開きましょう!

毎回ベタ打ちしていたあの password 部分を、上記のように書き換えれば設定完了です!

ENV[" "]のダブルクォーテーションの中には、.env ファイルで設定した変数名(手順 1 を参照)を書きます!

おわりに

 Windows で Rails と MySQL を合わせて使うのに、ここまで苦労するとは思いませんでした…。仲間内は Mac を使っている方が多く、

「え?別にエラーとかならなかったけど??」



と一蹴され、

と、何度も叫んでいました…。

 もし、同じような状況で苦しんでいる Windows ユーザーの方がいたら、この拙いブログ記事の情報が少しでも役に立てばと思います!!

お知らせ

 この MySQL エラーを乗り越えられたのも、今私が所属している「アプレンティス」というカリキュラム・同期の仲間たち・心強いメンターの方々のお陰です!

 プログラミングの「プ」の字も知らない文系出身の私ですが、日々成長を実感できるのが嬉しいです。

 定期的に募集をしていると思いますので、興味のある方はぜひチェックしてみてください!!

https://note.com/apprentice_jp/

Discussion