17
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-14

概要

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の該当部分を

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

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のデータベースとテーブルは自動で作成されない。
17
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
12