Edited at

【Rails/MySQL】RailsにMySQLを導入する方法【プログラミング学習149日目】


はじめに

先日1つ目のポートフォリオが完成し、2つ目のポートフォリオ制作に取り掛かっています。

2つ目のポートフォリオではMySQLを使用してみたいと考え、MySQLの導入方法を調べてまとめました。


開発環境


  • Ruby 2.5.1

  • Rails 5.2.2

  • MySQL 8.0.13


RailsへのMySQL導入方法

まずMac へ MySQL を Homebrew でインストールする手順を参考に下記1〜3を実施しました。


1. MySQLのインストール


インストール

 $ brew update

$ brew install mysql


インストールできたかの確認

 $ brew info mysql

-> mysql: stable 8.0.13 (bottled)


2. 起動・接続


MySQLの起動

 $ mysql.server start



MySQLへの接続(quitまたはexitで脱出可能)

 $ mysql -u root 



3. セキュリティ設定(rootのパスワード変更等)


セキュリティ設定(基本的に全てYesとして設定を進める)

 $ mysql_secure_installation

- 1.rootユーザのパスワード設定
- 2.anonymousユーザの削除
- 3.rootユーザがリモートサーバからログインできないようにする
- 4.テスト用のデータベースと接続するかどうかの確認を削除

rootアカウントで作業するのは抵抗があるため、次にRailsのDBを(初めから| |後から)MySQLに変更するを参考にしてMySQLユーザーの作成を行いました。


4. 再度MySQLへ接続、MySQLユーザーの作成


MySQLへ接続

 $ mysql -u root -p

Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.13 Homebrew

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>



MySQLユーザーの作成

 mysql> create user 'test-user'@'localhost' identified by 'password-example';

Query OK, 0 rows affected (0.06 sec)


作成されたかの確認

 mysql> select User,Host from mysql.user;

+------------------+-----------+
| User | Host |
+------------------+-----------+
| test-user | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)


権限の設定

 mysql> grant all on *.* to 'test-user'@'localhost';

Query OK, 0 rows affected (0.06 sec)


最後にquitで脱出

 mysql> quit



5. railsアプリの作成

以下を参考にしながらデフォルトがMySQLの設定になったrailsアプリの作成を行いました。

- RailsのDBを(初めから| |後から)MySQLに変更する

- Ruby on RailsでMySQLを使用する際の接続手順


Railsアプリの作成

 # 以下の2つのいずれかを用いればconfig/database.ymlがMySQLの設定になった状態でスタートできる

$ rails new アプリケーション名 -d mysql
$ rails new アプリケーション名 --database=mysql

config/database.ymlを確認すると以下のようになっています。


config/database.yml

  default: &default

adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password:
host: localhost

development:
<<: *default
database: アプリケーション名_development

test:
<<: *default
database: アプリケーション名_test

production:
<<: *default
database: アプリケーション名_production
username: アプリケーション名
password: <%= ENV['アプリケーション名_DATABASE_PASSWORD'] %>



6. railsアプリからのMySQLへの接続

(2019.2.12追記)

環境変数について、ローカル環境においてはパスワード等が公開されても特に困ることはないため、わざわざ環境変数で管理する必要もないとのこと。(誰も自分のローカル環境にアクセスすることはできないため。)

上記のdatabase.ymlにパスワード等を入れれば使えるようになりますが、パスワードを晒すのは嫌なので環境変数として管理したいと思い、MySQLの環境変数の設定方法について調査すると、dotenv gemで実現できることが分かりました。

(参考:RailsのDatabaseをsqlite3からMySQLにして、パスワードをdotenvで定数化する


Gemfile

# 以下2つを追加

gem mysql2
gem dotenv-rails

bundle installを実行すれば、以下のような形で記述できるようになり、パスワードを晒さなくてよくなります。


config/database.yml

 development:

adapter: mysql2
encoding: utf8
database: <%= ENV['DATABASE_DEV_NAME'] %>
pool: 5
username: <%= ENV['DATABASE_DEV_USER'] %>
password: <%= ENV['DATABASE_DEV_PASSWORD'] %>
host: <%= ENV['DATABASE_DEV_HOST'] %>

そして最後に、touch .envでアプリケーションのルートディレクトリに.envファイルを追加してそのファイルに以下のように記述することでRailsアプリからMySQLと接続可能になります。

この時に、.gitignore.envを追加しておかないとプッシュした時にパスワード等が結局晒されることになるので注意が必要です。


.env

 DATABASE_DEV_PASSWORD = '設定したパスワードを記入'

DATABASE_DEV_USER = '作成したMySQLユーザー名を記入'
DATABASE_DEV_HOST = 'localhostとか'

ここまでできたら、$ rails db:createでDB作成します。

成功すればMySQLの導入は完了です!


その他MySQLに関するメモ

本編とはあまり関係ないですが、MySQLでテーブル中のカラムの内容を取得する方法も調べる機会があったのでついでに備忘録として載せておきたいと思います。


1.MySQLにアクセス

$ mysql -u root -p



2.データベースを指定

# 例えば、sample_appdevelop環境用のDBにアクセスしたい場合

mysql> use sample_app_development


3.カラムを調べる

# 例えば、usersカラムの内容を知りたい場合

mysql> desc users;


(参考)上記1,2を一コマンドで実行する方法

$ mysql -u root -D sample_app_development -p



まとめ


  • RailsにMySQLを導入する際の手順についてまとめました。

  • パスワード等を環境変数で管理するための方法についても触れました。


参考URL