はじめに
先日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.server start
$ mysql -u root
3. セキュリティ設定(rootのパスワード変更等)
$ mysql_secure_installation
- 1.rootユーザのパスワード設定
- 2.anonymousユーザの削除
- 3.rootユーザがリモートサーバからログインできないようにする
- 4.テスト用のデータベースと接続するかどうかの確認を削除
rootアカウントで作業するのは抵抗があるため、次にRailsのDBを(初めから| |後から)MySQLに変更するを参考にしてMySQLユーザーの作成を行いました。
4. 再度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> 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)
mysql> quit
5. railsアプリの作成
以下を参考にしながらデフォルトがMySQLの設定になったrailsアプリの作成を行いました。
# 以下の2つのいずれかを用いればconfig/database.ymlがMySQLの設定になった状態でスタートできる
$ rails new アプリケーション名 -d mysql
$ rails new アプリケーション名 --database=mysql
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で定数化する)
# 以下2つを追加
gem mysql2
gem dotenv-rails
bundle install
を実行すれば、以下のような形で記述できるようになり、パスワードを晒さなくてよくなります。
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
を追加しておかないとプッシュした時にパスワード等が結局晒されることになるので注意が必要です。
DATABASE_DEV_PASSWORD = '設定したパスワードを記入'
DATABASE_DEV_USER = '作成したMySQLユーザー名を記入'
DATABASE_DEV_HOST = 'localhostとか'
ここまでできたら、$ rails db:create
でDB作成します。
成功すればMySQLの導入は完了です!
その他MySQLに関するメモ
本編とはあまり関係ないですが、MySQLでテーブル中のカラムの内容を取得する方法も調べる機会があったのでついでに備忘録として載せておきたいと思います。
$ mysql -u root -p
# 例えば、sample_appのdevelop環境用のDBにアクセスしたい場合
mysql> use sample_app_development
# 例えば、usersカラムの内容を知りたい場合
mysql> desc users;
$ mysql -u root -D sample_app_development -p
まとめ
- RailsにMySQLを導入する際の手順についてまとめました。
- パスワード等を環境変数で管理するための方法についても触れました。