13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQLの接続についてdatabase.ymlに書ける設定

Posted at

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ではなくhostportを使うこともあったり、sslcaのようなオプションを渡したりすることだと思う。

設定の分類

ActiveRecordの設定は、

  1. Connection poolに関するもの
  2. MySQLの接続に関するもの

の二つがある。

Connection poolの設定

Connection poolの設定には、poolidle_timeoutcheckout_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

encodingcollationが指定されているとき、ActiveRecordはMySQLとの接続を確立したときにSQLを自動で発行する。

MySQLで日本語や絵文字を扱うときに重要な設定なので、各自で確認すること。

wait_timeout

wait_timeoutはMySQLの設定に出てくるものと同じで、MySQLに接続したクライアントが切断されるまでのタイムアウトを秒数で指定する。

指定がない場合、RailsがMySQLで設定できる最大の値に自動で設定する。

ちなみに、variables経由ではwait_timeoutは指定できない。(Railsが上書きしてしまうから。)

variables

variablesに書かれている設定をActiveRecordはセッションの設定として指定する。

strict

この項目にはdefaultまたはtruefalseが書ける。省略するとtrueになる。

defaultのときはMySQLのサーバの設定をそのまま見る。trueのときには、STRICT_ALL_TABLESになる。falseのときには、サーバの設定を元にSTRICT_ALL_TABLESSTRICT_TRANS_TABLESTRADITIONAL無効になった設定になる。

これは要するにsql_modeの設定なので、variablesで設定することもできる。(variables.sql_modeで設定したものが優先される。)

statement_limit, prepared_statements

なんか指定できる。(良くわからない。)

DATBASE_URL環境変数経由では?

クエリパラメータとして上記のオプションが設定できる。書いてないものはdatabase.ymlのものが使われる。

が、variablesは指定できない気がする。mysql2://host/db?variables[sql_mode]=STRICT_TRANS_TABLESなどとしても効果がなかった。

13
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?