[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

トラックバック(0)

このブログ記事を参照しているブログ一覧: [ruby]DBI経由Mysqlのquoteメソッド

このブログ記事に対するトラックバックURL: http://mogya.com/mt/mt-tb.cgi/768

コメントする


画像の中に見える文字を入力してください。

このブログ記事について

このページは、 もぎゃが 2009年8月17日 11:29に書いたブログ記事です。

ひとつ前のブログ記事は「 無料でWindows/Macの各種ブラウザの見え方チェックができるAdobeBrowserLabが便利 」です。

次のブログ記事は「 技術用語の英語訳をWikipediaで探すアイデア 」です。

最近のコンテンツは インデックスページ で見られます。過去に書かれたものは アーカイブのページ で見られます。

Powered by
Movable Type