背景
Railsのデータベースを作成する時にdatabase.ymlを修正したりしますが、その中で気になっていたところについて関連記事を探してまとめてみました。
database.ymlの中身
まずはdatabase.ymlファイルを開いてみました。保存場所は「hoge/config/database.yml」にあります。
アプリ名は「hoge」という名前で作成。
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password:
socket: /tmp/mysql.sock
development:
<<: *default
database: hoge_development
test:
<<: *default
database: hoge_test
production:
<<: *default
database: hoge_production
username: root
password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
ファイルの中身は大きく分けて①default②development③test④productionとなっていることが分かります。①のdefaultは基本設定で②のdevelopmentは開発環境、③のtestはテスト環境、④のproductionは開発環境であることが何となく分かります。上記の中でも気になった記述がいくつかあったので調べてみました。
「&default」、「<<:」、「*default」について
①「&」はアンカー
「&」の部分はアンカーという「YAML」の記述方法。「YAML」とは今回でいうと拡張子が「.yml」になっているファイルのこと。今回の場合、「database.yml」を指します。「&」に続けて「default」という名前をつけると、「default」という名前でハッシューのデータを保存することができます。つまり、「&default」とすると、
default:
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password:
socket: /tmp/mysql.sock
の内容が「default」という名前で丸ごと保存されることになります。
②「*」はエイリアス
「*」をつけることによって、アンカーの内容を呼び出します。
③「<<:」の意味は?
エイリアスで呼び出した内容を付け足すという意味。「マージ」するといいます。
要するに同じ内容を繰り返し書くのではなくて、「default」という名前で変数みたいに保存しておいて、重複しそうな箇所に付け加えることですね。
ENV.fetch("RAILS_MAX_THREADS"){ 5 }とは
ENVはルビのオブジェクトであり、ENV["環境変数名"]で環境変数を呼び出すことができます。「.fetch」はENVオブジェクトが持つメソッド。「.fetch("環境変数名"){ 値 }」とすると「"環境変数名"=key」が存在すれば環境変数の値を返し、存在しなければデフォルト値として{ 値 }を返す意味になります。環境変数はMACの場合ターミナルで「vim ~/.zshrc」と入力すれば確認できます。「export RAILS_MAX_THREADS='値'」がなければ「pool: 5」になりますね。
poolとは
「コネクションプール」。データベースへ接続した時の接続状態を保存しておく役割をします。データベースに再接続する場合、この「コネクションプール」を利用することによって接続時間を短縮する仕組みらしいです。この「コネクションプール」の数が足りないとリクエストに対する待ち時間が増えてしまい、「ActiveRecord::ConnectionTimeoutError」などが発生するんだとか。デフォルト値は5。
adapter
接続するデータベースの種類。Railsで利用できるデータベース公式ドキュメントでは
DB2
Firebird
Frontbase
MySQL
Openbase
Oracle
PostgreSQL
SQLite
SQL Server
Sybase
になっています。
#socketとは
ネットとプログラムを繋げる出入り口を示します。mysqlの場合、localhost(自分のpc)では「/tmp/mysql.sock」で、 RPM【Red Hat Package Manager】のCentOS上だと「/var/lib/mysql/mysql.sock」になるみたいです。
#結論
ネットワークの知識は知っておくとプログラミングとは直接関係はないけど、知っておくことによってより理解が深まり学習が楽しくなります。特にバックエンドエンジニアにとってはサーバーとのやりとりでデータベースは欠かせないものなので、関連知識を身につけるのは非常に良いと思いました。また、ymlというファイル形式についても学習を進めたいと思います。
参考サイト&記事
https://railsdoc.com/config
https://qiita.com/ryouya3948/items/ba3012ba88d9ea8fd43d
https://qiita.com/katsuyuki/items/42b3c69bcd76c44ad64a
https://qiita.com/sukebeeeeei/items/576f109d57218c8397d5
https://qiita.com/terufumi1122/items/b5678bae891ba9cf1e57
https://www.wakuwakubank.com/posts/488-it-yaml/
https://docs.ruby-lang.org/ja/latest/method/ENV/s/fetch.html
https://qiita.com/megadreams14/items/32a3eed4661e55419e1c
https://dev.mysql.com/doc/refman/5.6/ja/problems-with-mysql-sock.html