概要
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.3.1 | こちらも教材に合わせた。rbenvで管理。 |
Bundler | 1.14.6 | |
mysql2 | 0.4.6 | バージョン指定せず、最新版。これが諸悪の根源 |
#エラーに至るまで
筆者はdot installのRuby on Rails 4入門 (全28回)の教材を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の教材の指示通り、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
この記事によると、
Rails4.2.5より前のバージョンでは、Rails(mysql2 adapter)の方でmysql2を0.3系依存で定義してしまっているので、mysql2最新の0.4.0を受け付けない
とのこと。そんなの知らねえよ。。。
GemfileとGemfile.lockの該当部分を
・・・
gem 'mysql2', '~> 0.3.20'
・・・
・・・
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
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のデータベースとテーブルは自動で作成されない。