test-mysqld と dbi で MySQL を使う on Ruby
MySQL Casual Advent Calendar 2011 12日目のエントリです。
Perl で MySQL のような RDBMS を扱うといえば、まず思い浮かぶのは DBI だと思います。MySQL 用には DBD::mysql というドライバがありますし、他の RDBMS 用のドライバも揃っており、各種O/Rマッパーの土台としても使われ、デファクトと言っても過言ではないでしょう。
一方 Ruby で RDBMS を扱う場合、データベースの種類ごとに独自I/Fを持ったライブラリが用意されていることが多いかと思います。MySQL においては 10日目の tagomoris さんのエントリ に紹介されているように ruby-mysql や mysql2 などがあります。
このような RDBMS ごとのドライバの違いは、各種O/Rマッパーが吸収することで統一的操作が可能になります。実は Ruby にも dbi モジュールはちゃんとあって、dbd-mysql という MySQL 用ドライバもありますので、Perl で DBI にすっかり慣れたユーザにはこっちのほうがとっつきやすいかもしれません。
さて、MySQL のテストを簡単に行うといえば、Perl ではおなじみ Test::mysqld でテスト用インスタンスを動的に作っちゃう方法がありますが、これの Ruby 版である test-mysqld という gem があることは前にちょこっと触れたことがあります。ただこいつは先述の mysql や mysql2 というドライバと一緒に使うことを想定した設計なため、Test::Mysqld#dsn が返す値もそういう感じになっています。
このままでは dbi と一緒に使いにくいので、こんなモンキーパッチを当ててあげると使いやすくなります。
やってることは簡単なんですけど、ちょっとした工夫で MySQL と dbi を使ったテストも書きやすくなるので、とってもカジュアルですね!
ちなみに、環境によって(CentOS で本家の MySQL-community-server の RPM を導入した場合など)は mysqld が見つからなく、test-mysqld の実行で失敗する場合もあるかと思います。そんな時は PATH=$PATH:/usr/sbin ./test.rb といった感じでカジュアルにサーチパスを追加してやるといいですね!
それでは明日は koratoiro kotaroito さんです。お楽しみに!
(追記)名前表記が間違っていました!kotaroito さんすいませんでした。ご指摘くださった riwyo さんありがとうございます。