【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 でインストールする手順](https://qiita.com/hkusu/items/cda3e8461e7a46ecf25d)を参考に下記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に変更する](https://qiita.com/reeenapi/items/9fc38c4f2f8186c78288)を参考にして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に変更する](https://qiita.com/reeenapi/items/9fc38c4f2f8186c78288 )
- [Ruby on RailsでMySQLを使用する際の接続手順](https://arma-search.jp/article/ruby-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で定数化する](http://www.kaasan.info/archives/4251)）

```ruby: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`を追加しておかないとプッシュした時にパスワード等が結局晒されることになるので注意が必要です。

```ruby:.env
 DATABASE_DEV_PASSWORD = '設定したパスワードを記入'
 DATABASE_DEV_USER = '作成したMySQLユーザー名を記入'
 DATABASE_DEV_HOST = 'localhostとか'
```

ここまでできたら、`$ rails db:create`でDB作成します。
成功すればMySQLの導入は完了です！

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

```SQL:1.MySQLにアクセス
$ mysql -u root -p
```
```SQL:2.データベースを指定
# 例えば、sample_appのdevelop環境用のDBにアクセスしたい場合
mysql> use sample_app_development
```
```SQL:3.カラムを調べる
# 例えば、usersカラムの内容を知りたい場合
mysql> desc users;
```

```SQL:(参考)上記1,2を一コマンドで実行する方法
$ mysql -u root -D sample_app_development -p
```

# まとめ
- RailsにMySQLを導入する際の手順についてまとめました。
- パスワード等を環境変数で管理するための方法についても触れました。

# 参考URL
- [Mac へ MySQL を Homebrew でインストールする手順](https://qiita.com/hkusu/items/cda3e8461e7a46ecf25d)
- [RailsのDBを(初めから| |後から)MySQLに変更する](https://qiita.com/reeenapi/items/9fc38c4f2f8186c78288 )
- [Ruby on RailsでMySQLを使用する際の接続手順](https://arma-search.jp/article/ruby-mysql)
- [RailsのDatabaseをsqlite3からMySQLにして、パスワードをdotenvで定数化する](http://www.kaasan.info/archives/4251)