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を使おう]('https://qiita.com/kompiro/items/5fc46089247a56243a62')

```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
```
今見たら一瞬で何が間違ってるかわかるのに！！
結構な時間さまよってました。。穴があったら入りたい（２回目）。

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

```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
```


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


####参考
* [Mysql2で「Access denied for user 'root'@'localhost'」]('https://qiita.com/Ushinji/items/1bd4b7f1cad87e717ac2')
* [railsのapp作成でmysqlを使用する時の導入とハマるところ　rake db:createができるまでの流れ　]('https://qiita.com/Kaisyou/items/17142ff2d080d565fedc')
* [Mysql2::Error::ConnectionError: Access denied for user 'root'@'localhost' (using password: YES)への対処]('https://qiita.com/zenfumi/items/a74497e40cb82cca33c2')
* [Mac MySQL 8.0 再インストールする]('https://qiita.com/ucan-lab/items/d02ec1de31613b2add0e')