おそらくはそれさえも平凡な日々

DBI->connectの第4引数の内容は設定ファイルに書かないほうが良い

Perlでデータベースに接続する場合は以下の様な感じになります。どんなORMなりラッパーなりもDBIを利用しているモジュールは内部的にはこういうことをしているわけです。

DBI->connect($dsn, $user, $password, {
    mysql_enable_utf8   => 1,
    RaiseError          => 1,
    PrintError          => 0,
    ShowErrorStatement  => 1,
    AutoInactiveDestroy => 1,
});

第1〜第3引数は環境によって差異があるので設定ファイルに情報を持たせると思います。ただ、それにつられて第4引数も設定ファイルに書いてしまうのが散見されますが、これは良くない。

第4引数の値はプロジェクトでは固定に決まっているので、設定ファイルによって自由度を持たせる必要性が全く無いというかむしろ悪。この人の環境ではテストに通るけどこの人の環境では通らないとかそういう状況が容易に起こりうる。

同じような話で、DBの接続処理でSET SESSION sql_mode='TRADITIONAL'(TRADITIONALはMySQLで一番厳しいSQL mode)を発行するのは絶対やったほうがいいと思っている。これも環境によってテストが通る通らないみたいなことを起こさないようにするのというか、本番ではTRADITIONALで運用するに決まってるのでTRADITIONALにする。

DB接続時に発行するのは、自前で$dbh->doとかするんじゃなくて、ORMに用意されている仕組み(on_connect_doとか)だったり、生DBIだったらCallbacksとかを使うべし。そうしないと再接続が走った時に発行されなかったりして悲しみなので注意。

ちなみに上の設定内容はkazeburo先生のDBI->connect 時に使う鉄板オプションを教えて!からコピペしました。DBIx::Sunnyを使うと上記のオプションが自動で使われるようになっているので素晴らしいですね。

みたいなことを最近社内のコードレビューで話しました。

created at
last modified at

2019-06-05T11:10:14+0900

comments powered by Disqus