«前の日記(2009-05-23) 最新 次の日記(2009-05-25)» 編集

KONO's Diary-休むに似たり



2009-05-24 [長年日記]

_ [ruby] windowsのruby、requireで失敗(修正あり)

Windowsでruby使ってODBC経由でRDBにアクセスしようと思い、以下のようなコードを書いた。

# sample.rb
require 'rubygems'
require 'DBI'

dbh=DBI.connect("DBI:ODBC:DSN","user_id","password") sth=dbh.execute("select * from table") while row=sth.fetch_hash do p row end sth.finish

実行してみたところ、[table]の内容は正常に表示されるのだけど、その前に変なWarningが出る。

C:/tools/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.1/lib/dbi.rb:93: warning: already initialized constant VERSION
C:/tools/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.1/lib/dbi.rb:96: warning: already initialized constant API_VERSION
C:/tools/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.1/lib/dbi.rb:100: warning: already initialized constant DEFAULT_TRACE_MODE
C:/tools/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.1/lib/dbi.rb:101: warning: already initialized constant DEFAULT_TRACE_OUTPUT

どうもVERSION等の定数が二回初期化されているっぽい。 調べてみると、dbi.rbから読んでいるodbc.rbの中で

require 'dbi'

という記述があって、sample.rbの冒頭部のrequireとodbc.rbのrequireで二回requireが効いてしまった模様。 で、二回requireさせないためにはどうすれば良いか、みたいなことを色々調べて、はまってしまったのだった。

既にお気づきの方も多いだろうが、正解は、sample.rbのrequire文が

require 'DBI'

と大文字になっているのが問題で、ここを小文字にするだけで解決する。でもこんな初歩的なミスで二時間以上もロスしてしまった(実はrubyの環境を疑ってインストールし直したりもした)。 WindowsだとDBI.rbもdbi.rbも同じファイルになってしまうために起こる勘違いで、unix系なら

irb(main):001:0> require 'DBI'
LoadError: no such file to load -- DBI
        from (irb):1:in `require'
        from (irb):1
        from :0
irb(main):002:0> require 'dbi'
=> true

ということでこういう間違いは発生しない。

requireは一度読み込んだファイルは二度と読み込まない」ということも今回あらためて確認した。

(2014/02/09 修正) コード部分、DBへの接続で

dbh=DBI.connect("dbi:odbc:DSN","user_id","password")
と'dbi','odbc'を小文字で書くとruby2.0の時にうまくいかないので、大文字に変更した。経緯はこちらを参照。

[]



あわせて読みたい rss
«前の日記(2009-05-23) 最新 次の日記(2009-05-25)» 編集
カバー画像はWikimedia Commonsより。
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
画像提供元:http://commons.wikimedia.org/wiki/Image:Field_of_hay_bales_-_omeo.jpg