mysql2-cs-bind released!
前に RubyでMySQLに繋ぐためのruby-mysqlとmysql2 - tagomorisのメモ置き場 というエントリで書いたとおり、いまおそらく最もよく使われそうな mysql2 という ruby用のmysqlドライバにはprepared statementを扱うためのAPIがない。MySQLではprepared statementを使っても使わなくても速度に影響は無いらしい(後のtweet参照)し、O/R Mapperを経由しての使用がメインだから不要、という判断なのだろう。
(p19)MySQLの場合: PreparedStatementプール機能の利用有無は、性能にまったく影響しません・パラメータのバインド機構の利用有無は、性能にまったく影響しません / Microsoft PowerPoint - URL
しかし自分はO/R Mapperを使わない書き方をすることが非常に多く、そういうケースで自分で値をエスケープしながらSQLに埋め込んでいくのは非常に嫌だ。なんというかDB2で育った自分の本能が拒否する。SQLを書いてある文字列リテラルでの変数展開は悪だし、SQL文を文字列結合で組み立てるのも悪だ!!!!!!!という肌感覚が抑えられない。
なので、先のエントリを書いたあとでmysql2を使う機会がいくつかあり、しょうがなくクライアントサイドでバインド変数を擬似的に実現するようなインターフェイスを作って使っていた。ら、昨夜の MySQL Casual Talks vol.3 で @Spring_MT さんがその話をされてた。
手動エスケープとかカジュアルじゃないわ #mysqlcasual
まあ、やっぱり同じこと気にする人は世の中にいるのかな、ということで、せっかくなのでコードを整理してテストを書いて公開することにした、というのがここまでの流れでした。これで自分が使うときもラクができるし。
tagomoris/mysql2-cs-bind · GitHub
mysql2-cs-bind | RubyGems.org | your community gem host
使いかた
mysql2のかわりに mysql2-cs-bind をrequireすれば、あとは普通にMysql2::Clientを使うだけです。が、バインド変数を使うときは Mysql2::Client#xquery を使います。
# require 'mysql2' されてても特に問題ないけど require 'mysql2-cs-bind' client = Mysql2::Client.new(....) client.xquery('SELECT x,y,z FROM tbl WHERE x=? AND y=?', 16777216, 'ORANIE') #=> Mysql2::Result
返り値は Mysql2::Client#query のものと完全に同じ。そのほかいくつか注意事項があるので、READMEを読んでください。
かじゅある!!!!