Ruby
Rails
MySQL

Mysql2で「Access denied for user 'root'@'localhost'」

問題と原因

railsのアプリケーションを作る際に、rails dbを実行したら以下のエラーが発生しました。エラー内容は、パスワードが無いので、rootでmysqlに接続できませんという内容です。

$ rails db:migrate
rails aborted!
Mysql2::Error: Access denied for user 'root'@'localhost' (using password: NO)

対策

railsにおけるDBの設定ファイルである、database.ymlに、以下のように自分の環境におけるパスワードを設定してあげればOKです。

/config/database.yml
default: &default
  username: USERNAME
  password: PASSWORD

direnvを使って、環境変数の設定

上述の設定で動作はするのですが、パスワード等の公開したくない情報をコードに直書きはよろしくないです。なので、それらの情報を環境変数へ定義します。

自分は、direnvを使って環境変数を定義しています。direnvは、各ディレクトリ毎に環境変数を定義することができるので、プロジェクト毎に環境変数を管理することができて、とても便利です。

https://github.com/direnv/direnv

以下、環境変数の設定

/.envrc
export DB_USERNAME: USERNAME
export DB_PASSWORD: PASSWORD

そして、secret.ymlへ設定した情報の呼び出し方法は、以下の通りです。

/config/database.yml
default: &default
  username: ENV['DB_USERNAME']
  password: ENV['DB_PASSWORD']

参考にしたサイト