rails db:create:allできるまでの話


RailsとMySQLでアプリケーションを作成しようとするものの、
のっけからデータベースの作成につまづいた話の覚書です。
※かなり初歩的なミスでしたので暖かく見守ってください。

とにかく db:create:all出来ない

Rspecでテストを回したくてテストデータベースも作りたく、
bin/rails db:create:allするもいくつかの壁に阻まれる。

エラー① "Can't connect to local MySQL server"

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

結果 MySQLサーバ起動しましょう

mysql.server startでこのエラーは解決。なんて基本的な!穴があったら入りたい。

けれどもこれだけではdb:createできず。エラー②へ進む。

エラー② "Access denied for user 'root'@'localhost' (using password: NO)"

Access denied for user 'root'@'localhost' (using password: NO)

MySQLのrootユーザーへのアクセスが出来なかったよーと言われる。
MySQLのrootユーザーのパスワードはインストール時に設定済み。
mysql -u root -pではちゃんと設定したパスワードでMySQLにアクセスできる。

なんでや??
そんな時はこちらをチェック。

database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  host: localhost

パスワード空欄のままでした。。

結果 database.ymlにちゃんとパスワード設定しておきましょう。

しかしそのままパスワードを入れるのはよろしくないので、
今回はdirenvで環境変数を設定。

direnvの使い方は下記記事を参考にしました。
direnvを使おう

database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: ENV['DB_USERNAME']
  password: ENV['DB_USERPASSWORD']
  host: localhost
/.envrc
export DB_USERNAME=root
export DB_PASSWORD=password

ふぅ、これでよし。(よくない)
エラー③へ進む。

エラー③ "Access denied for user 'ENV['DB_USERNAME']'@'localhost' (using password: YES)"

Access denied for user 'ENV['DB_USERNAME']'@'localhost' (using password: YES)
Couldn't create 'product_development' database. Please check your configuration.

こんなポカミスするのは私くらいでしょう。

database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: ENV['DB_USERNAME']
  password: ENV['DB_USERPASSWORD'] 
  host: localhost

今見たら一瞬で何が間違ってるかわかるのに!!
結構な時間さまよってました。。穴があったら入りたい(2回目)。

結果 <%= %>抜けてますね。

database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_USERPASSWORD'] %>
  host: localhost

はい。これでおっけーーー!!
では、なかった。エラー④へ進む。

エラー④ "Access denied for user 'product'@'localhost' (using password: NO)"

え、なんでなんで?環境変数うまく設定できてなかった?
そしてまた'using password: NO'。

よく見たらuser 'product'@'localhost'と、usernameが変わっている。

これはdb:create:allしていることがミソでした。

結果 本番環境用も忘れずに、ってことでした。

db:create:allしてたので本番環境用のDBも作ろうとしてくれてたんですね。ごめんなさい。

database.yml
production:
  <<: *default
  database: ai_metimer_production
  username: product
  password: <%= ENV['PRODUCT_DATABASE_PASSWORD'] %>

現状、database.ymlに記載されたユーザー(上記の場合、productという名前のユーザー)はMySQL上に作ってなかったので、アクセスできなかったのでした。

ということでMySQLで本番用のユーザーを作り、そのユーザーに本番用DBへのアクセス権限を付与。
そのユーザー名とパスワードをdatabase.yml、.envrcに設定。

database.yml
production:
  <<: *default
  database: ai_metimer_production
  username: <%= ENV['PRODUCT_DATABASE_USERNAME'] %>
  password: <%= ENV['PRODUCT_DATABASE_PASSWORD'] %>
/.envrc
export DB_USERNAME=root
export DB_PASSWORD=password
export PRODUCT_DATABASE_USERNAME=product
export PRODUCT_DATABASE_PASSWORD=hogehoge

これで見事、開発用・テスト用・本番用のデータベースが作成されました!わーい
公開恥ずかしすぎるけど自分への戒めのための備忘録でございました。

参考