[ruby]DBI経由Mysqlのquoteメソッド

[ruby]DBI経由Mysqlのquoteメソッド
 DBIを経由してMysqlのquoteメソッドを呼ぶと、なぜかメソッドがないことになっている。
たとえばこんなコード。

irb(main):001:0> d = DBI.connect('dbi:Mysql:...', ...)
irb(main):001:0> d.quote('foo')
/usr/local/lib/ruby/gems/1.8/gems/dbi-0.4.2/lib/dbi/handles/database.rb:179:in `quote': undefined method `quote' for # (NoMethodError)

ググってみると、既に困った方がおられて。

dbh.quote name
みたいな事をやっていたんだけど、本番環境に乗せたら動かないので何かと思って調べた
ruby-dbiのquoteメソッド – 小柄な人

解決されていた。

言葉があってるのか微妙だけど、インスタンスのメソッドじゃなくてクラスのメソッドを直に使えば良かったみたい。

Mysql::quote name

おなじようにやれば解決するとはおもうけど、自分の場合、Mysqlクラスは直接呼びたくない事情があって、あまりこの解決法はとりたくありません。

要するに、なぜだかquoteメソッドがコメントアウトされたことが問題らしいので、適当なソースに下記を貼り付けてメソッドを最定義することにした。

# dbd-mysql (0.4.3)で quoteメソッドがなぜかコメントアウトされていて困るので再定義して復活させる
module DBI::DBD::Mysql
class Database < DBI::BaseDatabase
def quote(value)
case value
when String
"'#{@handle.quote(value)}'"
when DBI::Binary
"'#{@handle.quote(value.to_s)}'"
when TrueClass
"'1'"
when FalseClass
"'0'"
else
super
end
end
end
end

これで問題のコードは通るようになった。将来的に再度サポートされたら、上記コードだけ削除すればいいはず。

ボクが調べた限り、そもそもなぜコメントアウトしたのかはわかりませんでした。ご存じの方がいたらぜひ教えてください。

ググってこのページにたどり着いた方へ:
これを参考に同じ対処されるのは自由なのですけれど、
もし、セキュリティ上緊急の問題があってコメントアウトせざるを得なかったとかそんな理由だとすると、上記コードを貼り付けるのは、せっかく檻に入れた虎を自分で出してきていることになるので、自己責任でやってくださいね。

#postgressでも同じように困っている人がいる
RubyForge: Ruby/DBI: open-discussion