«前の日記(2009-06-25) 最新 次の日記(2009-07-02)» 編集

KONO's Diary-休むに似たり



2009-06-27 [長年日記]

_ [ruby] Windows環境でのRuby/DBI ODBCのセットアップ(追記あり)

先日の日記ではRuby/DBIのrequireについて書いたのだけど、それ以前の、dbi-odbcのセットアップで詰まっている人も多いらしい。もともとrubyってWindowsじゃなくて*nix系で使う方が多いしね。検索してみても、意外とWindows環境のrubyの情報は少ない。

ということで、rubyでODBCアクセスができるまでの手順をメモ。

なおruby本体は既にセットアップ済みとする。Windowsのrubyって、いくつかあるのだけどぼくが使っているのはActiveScriptRuby。基本的に.msiをダブルクリックするだけだが、個人的な好みによりC:\Program Files\ruby1.8以下ではなくC:\Tools\ruby1.8以下に入れている。

あと、Windowsのバージョンによる違いは…何かあるかもしれないけどまぁ適当に。ぼくの環境はXP Home。

さて、rubyからODBCにアクセスするためには、"dbi"と"dbd-odbc"という二つの拡張ライブラリを導入する。dbiというのは、rubyからRDBMSへのアクセスを統一的に行なうための拡張ライブラリで、dbd-odbcというのは、そのdbiを使ってodbcにアクセスするためのライブラリ。

拡張ライブラリの導入方法は大きく二つあって、一つはrubyforge等のリポジトリからzipアーカイブ*1をダウンロードしてきて、展開してインストールする方法、もう一つはgemコマンドを使って、ダウンロードとインストールを一気にやってしまう方法である。

今回はgemコマンドを使って導入する。

C:\>gem install dbi
Successfully installed deprecated-2.0.1
Successfully installed dbi-0.4.1
2 gems installed
Installing ri documentation for deprecated-2.0.1...
Installing ri documentation for dbi-0.4.1...
Installing RDoc documentation for deprecated-2.0.1...
Installing RDoc documentation for dbi-0.4.1...
C:\>gem install dbd-odbc
Successfully installed dbd-odbc-0.2.4
1 gem installed
Installing ri documentation for dbd-odbc-0.2.4...
Installing RDoc documentation for dbd-odbc-0.2.4...

この通り、非常に簡単。dbiのインストール時にdeprecatedという拡張ライブラリが一緒にインストールされているが、これはdbiがこのライブラリを参照しているため*2。実は、ぼくはこのライブラリをrubyforgeでは見つけられなかった。

dbiとdbd-odbcはrubyforgeから取ってきて入れても良いのだけど、その場合でもdeprecatedはgemで入れる必要があるみたい。昔のバージョンだったらdeprecatedは不要だったような気もするが。

まあそんなわけで今回はgemでセットアップ。会社のイントラなどからだったら、gemはファイアウォールに阻まれるかもしれないが、Webブラウザ同様にproxyを設定すれば問題ない。proxyの設定方法等はgem install helpで出る。

これであとは[コントロールパネル]→[管理ツール]→[ODBC]でODBCの設定を行ない、そのDSNをrubyスクリプトの中で指定してやればアクセスできる…と思いきや

C:/tools/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.1/lib/dbi.rb:294:in `load_drive
r': Unable to load driver 'odbc' (underlying error: wrong constant name odbc) (D
BI::InterfaceError)
        from C:/tools/ruby-1.8/lib/ruby/1.8/monitor.rb:242:in `synchronize'
        from C:/tools/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.1/lib/dbi.rb:236:i
n `load_driver'
        from C:/tools/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.1/lib/dbi.rb:154:i
n `_get_full_driver'
        from C:/tools/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.1/lib/dbi.rb:139:i
n `connect'
        from dbitest.rb:5

みたいなエラーが出る。実は、dbd-odbcのインストールの際、Cコンパイラでモジュールを作る必要があるのだけど、そこがばっさり抜けているのだった。*nixと違い、WindowsはCコンパイラなんて標準では入ってないし*3

世の中よくしたもので、このモジュールのコンパイル済の奴はODBC Binding for Rubyというサイトで配布されている。ここでは色々なものを配っているが、必要なのはi386-msvcrt-ruby-odbc.zipというファイル。これをダウンロード・展開すると、odbc.soとodbc_utf8.soという二つのファイルが出てくるので、それを(rubyの導入先)\lib\ruby\site_ruby\1.8\i386-msvcrtにコピーする。

以上でセットアップ完了。Windowsでもrubyは楽しいので、機会があればぜひ。

*1 Windows環境なのでtarボールではないのだった。昨今はWindowsでもtarボール扱えるソフトは多いからtarボールでもかまわないのだけど

*2 何をするライブラリかというと、推奨されない機能を使ったら「そいつは非推奨ですよ」と茶々を入れてくるものらしい

*3 Cコンパイラがあるぞ、という方は、rubyforgeからdbd-odbcのzipをダウンロードし、その中のreadmeに書いてある手順に従ってコンパイルすれば良い。この件、tarballの人は「readmeちゃんと読め」で良いのだろうけど、rubygemsの人は知らないとちょっと辛い。本エントリを書こうと思った一番の理由がこれ。

_ (2014/02/09 追記)

上記を書いたのはruby1.8の時代で、1.9や2.0では実はうまく動かせていなかったのだけど、べるべるさんのWebを見て試してみたところruby 2.0.0p353 (2013-11-22) [x64-mingw32]でもうまく動くようになった。

ポイントは、

  • べるべるさんのページにある通りDevKitを入れておく。
  • 同じくぺるべるさんのページの通り、gemでdbi, dbd-odbc, ruby-odbcを入れる。
  • rubyのコードでodbcに接続する際に
    dbh=DBI.connect("dbi:odbc:DSN","user_id","password")
    
    と'dbi'や'odbc'を小文字で書くのではなく
    dbh=DBI.connect("DBI:ODBC:DSN","user_id","password")
    
    と大文字で書く。

ということである模様。小文字だと

DBI::InterfaceError: Unable to load driver 'odbc' (underlying error: wrong constant name odbc)
        from d:/Ruby/Ruby200-x64/lib/ruby/gems/2.0.0/gems/dbi-0.4.5/lib/dbi.rb:300:in `block in load_driver'
        from d:/Ruby/Ruby200-x64/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
        from d:/Ruby/Ruby200-x64/lib/ruby/gems/2.0.0/gems/dbi-0.4.5/lib/dbi.rb:242:in `load_driver'
        from d:/Ruby/Ruby200-x64/lib/ruby/gems/2.0.0/gems/dbi-0.4.5/lib/dbi.rb:160:in `_get_full_driver'
        from d:/Ruby/Ruby200-x64/lib/ruby/gems/2.0.0/gems/dbi-0.4.5/lib/dbi.rb:145:in `connect'
というエラーになる。

それで思い立って1.8環境でも"DBI:ODBC:DSN"と大文字の記述にしてみたらそちらもうまく行ってしまった。どうも最初から記述を間違えていたらしい。お恥ずかしい。

これまでこの接続がうまく行かなかったのでrubyは1.8xからなかなか上げられなかった。dbiを介さないruby-odbcだけであれば2.0でも動いたので今後はそちらで考えようかと思っていたのだけど、これがうまく行ったのは非常に嬉しい。

[]



あわせて読みたい rss
«前の日記(2009-06-25) 最新 次の日記(2009-07-02)» 編集
カバー画像は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