QA@IT

ruby dbi colmun_info() で"`[]=': can't add a new key into hash during iteration" となる件について

3138 PV

rubyのdbiインタフェースで 以下の例に示すような mysql コマンドのようなものを作ろうとしています。
しかし、column_info() でタイトルのエラーとなって対処方法を探っています。
現在、dbi のバージョンに起因する(http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=637794)に
症状が近いと思っています。gem をつかったバージョンの入れ替えなど具体的操作をご指南いただける
たら幸いです。

出力例)

  • select * from test01; col01 = "abc" col02 = 127 col03 = true col04 = 32767 -

●環境(ubuntu)
$ gem list
*** LOCAL GEMS ***
dbd-mysql (0.4.4)
dbi (0.4.5)
deprecated (3.0.1, 2.0.1)
mysql (2.9.1)
ruby-mysql (2.9.11)

●ソース
require 'rubygems'
require 'dbi'
dbh = DBI.connect('dbi:Mysql:naoki:localhost','','')
stmt = "select * from test01"
begin
sth = dbh.execute(stmt)
sth.column_info.each do |val|
p val
end

回答

dbi が Ruby 1.9.3(とか 2.0.0)に対応していないためだと思います。

たとえば、以下のコードは Ruby 1.8.7 では動きますが、1.9.3 だと "can't add a new key into hash during iteration" になります。

hash = {:a=>1, :b=>2}
hash.each do
  hash[:c] = 123
end

Hash#each の中でそのハッシュに値を追加することが許されなくなったため、エラーになります。dbi ライブラリの中も同じような処理が行われているのだと思います。

編集 履歴 (0)

tmtmsさん。丁寧なご回答ありがとう御座います。
バージョンを 1.8.7 などにして試してみます。

行き詰っていたので、大変助かりました。

編集 履歴 (0)
  • tmtmsさん、ご指摘頂いた通り ruby1.8.7 で動作確認ができました。
    貴重なお時間を割いてのご返答、大変有難う御座いました。
    私もいつか皆様のお役に立てるよう精進したいと思います。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。