Rails4.0でMySQLに接続するときにどツボにハマった

# 概要
dotinstallのrails教材をmysqlで進めようとしたところ、まさかの`rails s`をする時点で

- ActiveRecord::ConnectionNotEstablished
- Mysql2::Error Unknown database

の二つのエラーにハマった。

# 対象読者
- Rails4.2.5より前のバージョンでMySQLを用いて立ち上げる人
- dotinstallの教材と同じバージョンでカリキュラムを進めるが、DBだけはMySQLで進めたい人

# 実行環境
|        |   バージョン  |   Extra     |
|:-----------------:|:------------------:|:------------------:|
|CentOS|6.9|VirtualBox経由でssh接続|
| Rails             |     4.0.13          | dot installのRailsの教材がRails4.0を使っていたためv4.0の最新版にした               |
| MySQL           |    5.7.18         |              |
|     Ruby         |            2.３.1 |        こちらも教材に合わせた。rbenvで管理。        |
| Bundler                |         1.14.6        |             |
| mysql2                |         0.4.6        |    バージョン指定せず、最新版。これが諸悪の根源         |


#エラーに至るまで
筆者はdot installの[Ruby on Rails 4入門 (全28回)](http://dotinstall.com/lessons/basic_rails_v2)の教材をMySQLを使って進めようとしていた。

railsはバージョンごとに大きな変更点があるため、無駄なエラーを減らすためにdot installの教材内で用いられているrails4.0をインストールした。

```
$ gem install rails --version="~>4.0.0" #4.0.X系の最新バージョンをインストール
```
その結果、

```
$ rails -v
Rails 4.0.13
```
とrails4.0の最新版が正しくインストールされた。


```
$ rails new myapp -d mysql
```
としてmyappディレクトリを作成し、
[dotinstallの教材の指示](http://dotinstall.com/lessons/basic_rails_v2/24903)通り、`myapp/Gemfile`内のtherubyracerのコメントを外し、再び`bundle install`をすることでtherubyracerを導入した。
ここまで、エラーはなかった。

意気揚々とサーバーを立ち上げ（192.以降はホストのmac側のVagrantfileに記載しているプライベートネットワークのIPアドレス）、

```
$ rails s -b 192.168.◯◯.◯◯ 
=> Booting WEBrick
=> Rails 4.0.13 application starting in development on http://192.168.◯◯.◯◯:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2017-05-14 06:59:42] INFO  WEBrick 1.3.1
[2017-05-14 06:59:42] INFO  ruby 2.3.1 (2016-04-26) [x86_64-linux]
[2017-05-14 06:59:42] INFO  WEBrick::HTTPServer#start: pid=14387 port=3000
```
mac側のブラウザで

```
http://192.168.◯◯.◯◯:3000
```
とアクセスすると、エラーが。。。

#第一のエラー ActiveRecord::ConnectionNotEstablished
```
ActiveRecord::ConnectionNotEstablished

Rails.root: /home/vagrant/myapp
```
ActiveRecordの接続が確立されていない・・・？
恐らくDB周りのエラーだろうが、対処法が検討もつかなかったので、とりあえずググる。
「ActiveRecord::ConnectionNotEstablished」でググるも該当する現象がヒットしない。


#第一のエラー解決
DB周りのエラーということで、何となく

```
$ rake db:migrate
```
をしてみると、

```
$ rake db:migrate
(in /home/vagrant/myapp)
rake aborted!
Gem::LoadError: Specified 'mysql2' for database adapter, but the gem is not loaded. Add `gem 'mysql2'` to your Gemfile.
/home/vagrant/myapp/config/environment.rb:5:in `<top (required)>'
Gem::LoadError: can't activate mysql2 (~> 0.3.10), already activated mysql2-0.4.6. Make sure all dependencies are added to Gemfile.
/home/vagrant/myapp/config/environment.rb:5:in `<top (required)>'
Tasks: TOP => db:migrate => environment
(See full trace by running task with --trace)
```
・・・！？ 
mysql2が上手く機能していないようだ。このエラーコードでググると、ヒットした。

 [Rails4.2でmysql2を認識しない mysql2 is not loaded? -Qiita](http://qiita.com/oshin/items/f5ff336f63366c364909)

この記事によると、
**Rails4.2.5より前のバージョンでは、Rails(mysql2 adapter)の方でmysql2を0.3系依存で定義してしまっているので、mysql2最新の0.4.0を受け付けない**
とのこと。そんなの知らねえよ。。。

GemfileとGemfile.lockの該当部分を

```:Gemfile
・・・
gem 'mysql2', '~> 0.3.20'
・・・
```

```:Gemfile.lock
・・・
56     mysql2 (0.3.20)
・・・
114   mysql2 (~> 0.3.20)
・・・
```
と変更。
今度こそ、と思い、`rails s`を叩くと、また次なるエラーが。

#第二のエラー Mysql2::Error Unknown database

```
Mysql2::Error
Unknown database 'myapp_development'

Rails.root: /home/vagrant/myapp
```
今度はデータベースが見つからないそうだ。デフォルトで作成されないの？


#第二のエラー解決
ぐぐってみるとこれまた　Qiitaの記事にヒット。

[railsでデータベース作成＆マイグレート（MySQL） -Qiita](http://qiita.com/blueinkinc/items/9d7ecaff927b68143721)

> RailsでデフォルトデータベースのSQLiteはテーブル作成と同時にデータベースも作成してくれるが、MySQLはデータベースを作成した後に、テーブルを作成する必要がある。したがってデータベースがない状態でマイグレーションしてもエラー(rake aborted! Unknown database)が出る。

rakeコマンドでDB作成。

```
#データベース作成(development/test/productionのすべてを作成)
$ rake db:create:all
```
エラー無く通った。

mysqlにログインしてDBが作成されているかどうか確認すると、

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| myapp_development  |
| myapp_production   |
| myapp_test         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)
```
ちゃんと出来ている！


`rails s`を叩くと、

```
Welcome aboard
You’re riding Ruby on Rails!
```
長い道のりだったが、何とかrailsサーバーを立ち上げることが出来た。

#まとめ
- 古いrailsに最新版のツールは対応していないことがある。
- Rails newしても、MySQLのデータベースとテーブルは自動で作成されない。