RailsでMySQLを使いたいけど変更方法が分からなくて困っている人
RailsでMySQLを使うようにしたいけど変更方法がわからない…。MySQLを先にインストールしなきゃいけないのかな…?
今回の記事ではこんな方に向けて記事を書きます。
- Macを利用してRailsの環境を構築した人
- Railsで今までsqliteを使っていたけどMySQLに変更したい
- MySQLのインストール方法がわからない
こんにちは、himakuro(@himanakuroneko)です!
以前このhimakuroブログでは【初心者向け】MacでRailsを使えるようにするための環境構築方法を徹底解説!と言う記事を書きました。
この記事ではRailsの初期ページを表示するための内容に特化しており、データベースについてはノータッチでした。
そこで今回の記事ではRailsのデフォルトで使用されているSqliteからMySQLに変更するための手順をコマンド付きで解説をして行きます。
SqliteはRailsの環境構築さえ終わればすぐに利用出来るというメリットはありますが、やはりデータベースと言えばMySQLでしょう。
Web開発を行なっている現場でもMySQLを使うことが殆どなので、今回の記事を読んで是非MySQLをあなたのRailsプロジェクトでも利用出来るようにして行きましょう。
RailsでMySQLを使うための流れ
今回はこの様な流れで作業をしていきます。
- Homebrewのインストール
- MySQLのインストール
- MySQLの起動・停止・自動起動の方法
- Gemでmysql2の導入
- データベースの設定変更
- マイグレーションを実行して動作確認
Homebrewのインストール
今回はMySQLをHomebrewというパッケージ管理ツールでインストールして行きます。
当ブログではRailsの環境を構築する時にHomebrewの入れ方と、道入するメリットを解説しています。
もしまだHomebrewをインストールされていない場合は、下記の記事を参考にインストールしておきましょう。
MySQLのインストール
下記のコマンドをターミナルで実行してMySQLをインストールしていきます。
Console
# brewの更新
$ brew update
# mysqlのインストール
$ brew install mysql
# インストールされたmysqlのバージョンを確認
$ mysql --version
ちなみにbrewコマンドによってインストールされるパッケージは、決まったディレクトリに自動で入るようになっているので、brewコマンドはどのディレクトリで実行しても問題ありません。
MySQLの起動・停止・自動起動
ここでMySQLの起動方法や停止方法を把握しておきましょう。
まずはbrewコマンドでmysqlの情報の確認です。
Console
# mysqlの情報を確認
$ brew info mysql
------- ここから実行結果 -------
mysql: stable 8.0.21 (bottled)
.
.
.
To connect run:
mysql -uroot
To have launchd start mysql now and restart at login:
brew services start mysql
Or, if you don't want/need a background service you can just run:
mysql.server start
コマンドを実行するとバージョンが表示される他に、たくさんの英文が表示されると思います。
この内容で重要なのは下記の3つです
- 接続方法
- ログイン時に自動で起動させる方法
- 手動で起動する方法
MySQLへの接続方法
MySQLをインストールした直後は、下記のようなコマンドを実行することで接続をすることが出来ます。
Console
$ mysql -uroot
ログイン時に自動でmysqlを起動させる方法
パソコンを起動させるたびに、手動でmysqlを起動するのは手間だと思う人もいると思います。
その場合は下記のコマンドを実行して、起動時には自動でmysqlが起動する設定にしておきましょう。
Console
$ brew services start mysql
毎回手動でmysqlを起動させたい場合
mysqlは起動していても、特段負荷がかかるようなものではありません。
しかしやはり利用していない時に起動されているのは嫌な人もいると思います。その場合は下記のコマンドを実行して起動するようにしましょう。
Console
$ mysql.server start
mysql2をGemでインストールする
MySQLの準備が出来たら次はGemのmysql2をインストールして行きます。
Gemfileの編集
mysql2をインストールするためにはGemfileを編集する必要があるので、Gemfileファイルを開きmysql2の行を追加しましょう。
Gemfile
# Use sqlite3 as the database for Active Record
gem 'sqlite3', '~> 1.4' # この行を削除する
gem 'mysql2' # この行を追加する
1点補足として、Railsをインストールしたタイミングによってsqlite3の行で記載されているバージョンが1.4とは異なります。
特に問題はないので、sqlite3の行を削除してmysql2の行を追加しましょう。
bundle installの実行
Gemfileの編集が終わったら、ターミナルでGemfileが存在するディレクトリでbundle installを実行します
Console
# ディレクトリの移動
$ cd ~/Documents/project/rails-practice
# ディレクトリの確認 (ユーザー名の部分は人によって異なる)
$ pwd
/Users/himakuro/Documents/project/rails-practice
# Gemfileがあることを確認
$ ls
Gemfile README.md app bin config.ru lib node_modules postcss.config.js storage tmp yarn.lock
Gemfile.lock Rakefile babel.config.js config db log package.json public test vendor
# bundle installでmysql2をインストール
$ bundle install
bundle installでエラーが出た場合
bundle installが上手く行かずに下記のようなエラーがでる場合があります。
Console
2 warnings generated.
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1
make failed, exit code 2
Gem files will remain installed in /Users/himakuro/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/mysql2-0.5.3 for inspection.
Results logged to /Users/himakuro/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/extensions/x86_64-darwin-19/2.7.0/mysql2-0.5.3/gem_make.out
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.
In Gemfile:
mysql2
このエラーの対処法としては下記の3ステップとなります
- opensslをbrewでインストール
- brew info opensslの実行
- 必要な環境変数を書き出す
brewでopensslをインストール
brewを使いopensslをインストールします。
Console
$ brew install openssl
opensslの情報を表示
インストールが終わったらopensslの情報をbrew infoで表示します。
Console
$ brew info openssl
openssl@1.1: stable 1.1.1g (bottled) [keg-only]
Cryptography and SSL/TLS Toolkit
https://openssl.org/
/usr/local/Cellar/openssl/1.0.2s (1,795 files, 12.0MB)
Poured from bottle on 2019-07-21 at 16:04:36
/usr/local/Cellar/openssl@1.1/1.1.1g (8,059 files, 18MB)
Poured from bottle on 2020-05-12 at 20:32:22
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/openssl@1.1.rb
License: OpenSSL
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
/usr/local/etc/openssl@1.1/certs
and run
/usr/local/opt/openssl@1.1/bin/c_rehash
openssl@1.1 is keg-only, which means it was not symlinked into /usr/local,
because macOS provides LibreSSL.
If you need to have openssl@1.1 first in your PATH run:
echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> /Users/himakuro/.bash_profile
For compilers to find openssl@1.1 you may need to set:
export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
For pkg-config to find openssl@1.1 you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"
==> Analytics
install: 586,594 (30 days), 1,906,939 (90 days), 6,842,127 (365 days)
install-on-request: 71,206 (30 days), 249,547 (90 days), 875,030 (365 days)
build-error: 0 (30 days)
大量の英語が表示されますが、ここで重要なのは下記の2行になります。
Console
export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
この2行に記載されている末尾の部分、下記で言うとXの部分がpathに相当するものになります。
export LDFLAGS=”XXXXXXXXXXXXX“
export CPPFLAGS=”XXXXXXXXXXXXX“
そして上記のpathの部分を下記のコマンドに当てはめていきます。
Console
# Xの部分を表示された内容がpath
$ bundle config --local build.mysql2 "--with-ldflags=XXXXXXXXXXXXX"
$ bundle config --local build.mysql2 "--with-cppflags=XXXXXXXXXXXXX"
# 実際にpathを置き換えた場合の実行例
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib"
$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl@1.1/include"
himakuro
pathは人によって異なる可能性があるから、しっかりとbrew info opensslで表示されたpathを指定するようにしよう!
bundle installでmysql2をインストール
ここまで出来たら、bundle installを実行してみましょう。
Console
$ bundle install
.
.
.
Bundle complete!
解決しなかった場合
上記の流れを行っても引き続きエラーが出てしまう場合は、下記のコマンドを実行してからbundle installを実行してみてください。
Console
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
$ bundle install
himakuro
bundle installは必ずGemfileが存在するディレクトリで実行しよう!
そして「Bundle complete!」と末尾に表示されれば実行完了!
Railsのデータベースをmysqlに変更
Gemのインストールが完了したら次はRails側のデータベースの設定を変更するためにconfig/database.ymlを編集します。
(変更箇所が多いので既存の内容を全て削除して、下記のコードをコピーして貼り付けることを推奨します)
config/database.yml
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password:
development:
<<: *default
database: [アプリ名]_development
test:
<<: *default
database: [アプリ名]_test
production:
<<: *default
database: [アプリ名]_production
username: <%= ENV['DB_USERNAME'] %>
password: <%= ENV['DB_PASSWORD'] %>
[アプリ名]の部分には開発しているアプリの名前を入れるのが一般的です。
例えば今回はrails_practiceと言う名前のリポジトリなので、development用のデータベース名はrails_practice_developmentのようにしていきます。test、productionも同様に設定しましょう。
マイグレーションを実行して動作確認
以上で設定は全て完了しました。最後にマイグレーションの動作確認を行いましょう。
Console
# データベースの作成(初回のみ必要)
$ bundle exec rails db:create
------- ここから実行結果 -------
Created database 'rails_practice_development'
Created database 'rails_practice_test'
# テーブルの作成
$ bundle exec rails db:migrate
himakuro
テーブル用のファイルをまだ1つも作成していない場合はmigrateを実行しても何も起きないよ!
ここではエラーが出ない事だけを確認しておこう!
Railsでmysqlを使えるように出来た
おつかれさまでした。
これであなたのRailsプロジェクトでMySQLが使えるようになりました。
Railsを扱っているようなWeb開発企業では、MySQLはほぼ必須のスキルとなっています。
もしまだsqliteで進めてしまっている場合は今回の記事を参考にMySQLに変更して、今のうちにMySQLのコマンドの使い方に慣れておくことを推奨します。
今回の記事は出来る限りわかりやすく書いたつもりではありますが、内容でここが分かりづらい・ここが間違っているなどあれば気軽にコメントをお願いします!