database.ymlとは何か?
Railsがデータベースに接続するための情報を記載したファイルです。
rails new <アプリ名>
でrailsのプロジェクトを新規作成した時に、configディレクトリ配下に自動生成されます。
なおRialsではデータベースを作成するときに、rails db:create
コマンドを使います。この時に、Rialsはdatabase.yml
の中身に基づいてデータベースを作成します。
デフォルトのデータベースはsqliteが指定されています。
sqlite以外のデータベースを指定する方法
デフォルトのsqlite以外のDBに変更したい場合は、rails new
でオプションを指定すると、指定したDBに合わせたdatabase.ymlを生成します。
rails new <アプリ名> -d <DBの種類>
「-d
」は「--database
」と同じです。
実例
#mysqlの場合
rails new test-app -d mysql
#postgresの場合
rails new test-app -d postgresql
database.ymlの中身
database.ymlの中には、コメントアウトで注釈がたくさん記載されています。
&
や<<:
、*
などyaml専用の記述が使われています。
以下では、rails new test-app -d postgresql
を実行した時に作成されるdatabase.ymlの中身で解説しています。
全体像
コメントアウトを除いてjsonにコンパイルすると以下のようになります。
default, development, test, productionの4つから構成されていることがわかります。
{
"default": {
"adapter": "postgresql",
"encoding": "unicode",
"pool": "<%= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } %>"
},
"development": {
"adapter": "postgresql",
"encoding": "unicode",
"pool": "<%= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } %>",
"database": "test-app_development"
},
"test": {
"adapter": "postgresql",
"encoding": "unicode",
"pool": "<%= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } %>",
"database": "test-app_test"
},
"production": {
"adapter": "postgresql",
"encoding": "unicode",
"pool": "<%= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } %>",
"database": "test-app_production",
"username": "test-app",
"password": "<%= ENV['TEST-APP_DATABASE_PASSWORD'] %>"
}
}
冒頭のコメントアウト
# PostgreSQL. Versions 9.3 and up are supported.
#
# Install the pg driver:
# gem install pg
# On macOS with Homebrew:
# gem install pg -- --with-pg-config=/usr/local/bin/pg_config
# On macOS with MacPorts:
# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
# gem install pg
# Choose the win32 build.
# Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
・PostgreSQLの対応するバージョン。9.3以上をサポート。バージョンはpostgres --version
で確認できる。
・pg
のインストール方法。pgはrailsからPostgreSQLのDBにアクセスするためのライブラリ。
pgを使うには、Postgresがインストールされている必要がある。
default
「default」はデフォルトの設定内容です。
DBの設定は(1)development, (2)test, (3)productionの3つが用意され、それぞれの共通部がこのdefaultになります。
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
・default: &default
&
はアンカーとよび、&アンカー名
で指定して*アンカー名
で呼び出すことができる。
&default
の配下(adapter~)の塊を*default
で呼び出せるようになる。
・adapter: DBの種類
指定したDB名が記載される。デフォルトはsqlite3
・pool: 数値
DBに接続するコネクションプールの上限数。
コネクションプールとは、DBの接続情報を維持しておく機能。(プールは人工的に作った表面上の小さな水たまり。DBの表面情に作ったコネクション用のパスといった感じ)
・<%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
rubyの記述。環境変数の中にRAILS_MAX_THREADSがあればその値を適用し、ない場合は5にする。
development
開発環境用のDB設定です。
development:
<<: *default
database: test-app_development
先ほどの&
アンカーで指定した内容を呼び出しています。以下と同じになります。
development:
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
database: test-app_development
・database
: DB名
defaultの設定にDB名アプリ名_development
を追加している。
development, test, porductionの違い
DBの構成としてtestとproductionもありますが中身はほぼ同じです。
共通部分
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
それぞれの違いはdatabase名の末尾です。productionの場合はusernameとpasswordが追加されます。
development
development:
database: test-app_development
test
test:
database: test-app_test
production
production:
database: test_app_production
username: test_app
password: <%= ENV['TEST-APP_DATABASE_PASSWORD'] %>