Ruby/DBI 0.1.1 + MySQLでのエラー

以下のような単純なスクリプトでも、Ruby/MySQL 0.2.6 (MySQL API の pure ruby 版)と Ruby/DBI 0.1.1 の組み合わせではエラーになるっぽい。

$cat mytest.rb
#!/usr/bin/ruby 

require 'dbi'

DBI.connect('DBI:Mysql:database=kagemai', 'kagemai', 'pass') do |db|
  puts db.select_one('select version()')
end
$ruby mytest.rb
/usr/lib/ruby/site_ruby/1.8/DBD/Mysql/Mysql.rb:662:in `column_info':
   undefined method `is_not_null?' for #<Mysql::Field:version()> (NoMethodError)
        from /usr/lib/ruby/site_ruby/1.8/DBD/Mysql/Mysql.rb:648:in `each'
        from /usr/lib/ruby/site_ruby/1.8/DBD/Mysql/Mysql.rb:648:in `column_info'
        from /usr/lib/ruby/site_ruby/1.8/DBD/Mysql/Mysql.rb:573:in `execute'
        from /usr/lib/ruby/site_ruby/1.8/DBD/Mysql/Mysql.rb:570:in `synchronize'
        from /usr/lib/ruby/site_ruby/1.8/DBD/Mysql/Mysql.rb:570:in `execute'
        from /usr/lib/ruby/site_ruby/1.8/dbi.rb:888:in `execute'
        from /usr/lib/ruby/site_ruby/1.8/dbi.rb:480:in `execute'
        from /usr/lib/ruby/site_ruby/1.8/dbi.rb:502:in `select_one'
        from mytest.rb:10
        from /usr/lib/ruby/site_ruby/1.8/dbi.rb:430:in `connect'
        from /usr/lib/ruby/site_ruby/1.8/dbi.rb:215:in `connect'
        from mytest.rb:9

Ruby/MySQL 0.2.6 + Ruby/DBI 0.1.0なら OK。また、MySQL/Ruby(C API版、あいかわらずややこしい)+ Ruby/DBI 0.1.1 も OK。
Windowsの場合は Ruby/DBI 0.1.0 を使うか、mysql-win を使えばよさそうだ。

DBまわり再実装

ベンチマークの結果がひどいのでPostgresStore3、MySQLStore3を書く。共通部分はほぼBaseDBIStore3にまとめることができた。

count_reports

レポート数 Pg3 My3
100 0.09 0.01
1000 0.06 0.06
10000 0.53 0.54
50000 2.83 2.50

collect_reports

レポート数 Pg3 My3
100 0.17 0.11
1000 1.43 1.11
10000 13.94 12.09
50000 78.10 67.58

まあこんなもんか。