Railsアプリでデータベースに接続する設定はconfig/database.ymlに書いたり、DATABASE_URL環境変数を設定したりして、与える。database.ymlに書ける内容についての情報がいまいちまとまっていない感じで、調べるのに苦労したのでまとめておく。
設定の例
Rails Guidesに書かれたMySQL設定の例を見ると、こんな感じ。
development:
adapter: mysql2
encoding: utf8mb4
database: blog_development
pool: 5
username: root
password:
socket: /tmp/mysql.sock
実用上は、大体ここに書いてあることを設定すればそれで良い。
他にありがちな設定としては、socketではなくhostとportを使うこともあったり、sslcaのようなオプションを渡したりすることだと思う。
設定の分類
ActiveRecordの設定は、
- Connection poolに関するもの
- MySQLの接続に関するもの
の二つがある。
Connection poolの設定
Connection poolの設定には、pool、idle_timeout、checkout_timeoutがあるらしい。
MySQLの接続に関するもの
MySQLに関する設定はActiveRecordによって処理されるものとmysql2 gemによって処理されるものがあり、一覧としては次の通りになる。
-
host(mysql2) -
username(mysql2) -
password(mysql2) -
port(mysql2) -
database(mysql2) -
socket(mysql2) -
flags(mysql2, activerecord) -
encoding(mysql2, activerecord) -
read_timeout(mysql2) -
write_timeout(mysql2) -
connect_timeout(mysql2) -
connect_attrs(mysql2) -
reconnect(mysql2) -
local_infile(mysql2) -
secure_auth(mysql2) -
ssl_mode(mysql2) -
default_file(mysql2) -
default_group(mysql2) -
default_auth(mysql2) -
init_command(mysql2) -
sslkey(mysql2) -
sslcert(mysql2) -
sslca(mysql2) -
sslcapath(mysql2) -
sslcipher(mysql2) -
sslverify(mysql2) -
wait_timeout(activerecord) -
variables(activerecord) -
strict(activerecord) -
collation(activerecord) -
statement_limit(artiverecord) -
prepared_statements(activerecord)
たくさんあるし、ソースコードをざっと眺めただけなので、もしかしたら欠けているものがあるかもしれない。
(mysql2)と書いたものは、mysql2 gemに渡されて処理されるものなので、ドキュメントを読むこと。
(activerecord)と書いたものは、ActiveRecordによって処理されるもので、とりあえずわかった限りで書いておく。
flags
ActiveRecordはmysql2 gemに渡すflagsをYAMLで良い感じに書くためのサポートを提供している。mysql2のドキュメントに書いてある。
encoding, collation
encodingとcollationが指定されているとき、ActiveRecordはMySQLとの接続を確立したときにSQLを自動で発行する。
MySQLで日本語や絵文字を扱うときに重要な設定なので、各自で確認すること。
wait_timeout
wait_timeoutはMySQLの設定に出てくるものと同じで、MySQLに接続したクライアントが切断されるまでのタイムアウトを秒数で指定する。
指定がない場合、RailsがMySQLで設定できる最大の値に自動で設定する。
ちなみに、variables経由ではwait_timeoutは指定できない。(Railsが上書きしてしまうから。)
variables
variablesに書かれている設定をActiveRecordはセッションの設定として指定する。
strict
この項目にはdefaultまたはtrueかfalseが書ける。省略するとtrueになる。
defaultのときはMySQLのサーバの設定をそのまま見る。trueのときには、STRICT_ALL_TABLESになる。falseのときには、サーバの設定を元にSTRICT_ALL_TABLESとSTRICT_TRANS_TABLESとTRADITIONALが無効になった設定になる。
これは要するにsql_modeの設定なので、variablesで設定することもできる。(variables.sql_modeで設定したものが優先される。)
statement_limit, prepared_statements
なんか指定できる。(良くわからない。)
DATBASE_URL環境変数経由では?
クエリパラメータとして上記のオプションが設定できる。書いてないものはdatabase.ymlのものが使われる。
が、variablesは指定できない気がする。mysql2://host/db?variables[sql_mode]=STRICT_TRANS_TABLESなどとしても効果がなかった。