CentOS5 で Ruby + PostgreSQL + DBI を使う

簡単にできると思ったら意外にハマったのでメモ。

  • yum install rubyruby を入れる
  • yum install postgresql postgresql-devel で postgresql を入れる
    • devel がないと pg などのインストールができない。
  • rubygems のソースをとってきてコンパイルして入れる
  • gem install pg dbi dbd-pg で dbi と pg 関係を入れる。
    • dbd-pg を入れないと、'load_driver': Unable to load driver 'Pg' (underlying error: uninitialized constant DBI::DBD::Pg) というエラーがおこる。

ここまででも psql コマンドは動くようになる。しかし、下みたいな rubyスクリプトでアクセスしようとすると、FATAL: Ident authentication failed for user "hoge" (DBI::OperationalError) と言われる。

require 'rubygems'
require 'dbi'

def main
  DBI.connect("DBI:Pg:test:localhost", "hoge", "passwd") do |dbh|
    dbh.select_all("SELECT * FROM sample") do |row|
      p row
    end
  end
end

main

これを解決する方法は下に書いてあった。毎度ながら、偉い人たちに感謝!

CentOS5 の場合、設定ファイルは /var/lib/pgsql/data/pg_hba.conf にある。この中に以下の行を追加する。(hoge ユーザで md5 認証にてすべてのデータベースにアクセスできるようにする場合)。

host all hoge 127.0.0.1/32 md5

md5 じゃなくて trust にすると、パスワード無しでアクセスできるようになる。password にすると平文のパスワードを許可する。なお、これを入れるのは

host all all 127.0.0.1/32 ident sameuser

この行より前でないと、こちらの行のほうが優先されてしまって、アクセスできなくなるぽい。

Deprecate 関連の warning

これでスクリプト自体は動くようになるものの、/usr/local/lib/ruby/gems/1.8/gems/deprecated-2.0.1/lib/deprecated.rb:199: warning: already initialized constant Deprecate という警告が出ることがある模様。dbi が使う deprecated というライブラリの中で Deprecated クラスを Deprecate という名前でも引けるようにしているのが、rubygems のライブラリの中で定義されている Deprecate という定数と衝突しているらしい。

このままでも動くんだけど、console や log にずらずらメッセージが並ぶのも困る。Deprecate を参照しているのは dbi.rb の中の1行だけなので、それを editor で修正して無理矢理なおしてみた。

  • /usr/local/lib/ruby/gems/1.8/gems/deprecated-2.0.1/lib/deprecated.rb 199 行をコメントアウトする
  • /usr/local/lib/ruby/gems/1.8/gems/dbi-0.4.5/lib/dbi.rb 72 行にある Deprecate.set_action を Deprecated.set_action に書きかえる

これで warning は出なくなる。もし deprecated.rb で定義されている定数 Deprecate を他のところで参照してたら、その時は動作がおかしくなる可能性はある。その場合でも、Deprecate を Deprecated になおして使ったほうがよさげ。

なお、下のページを参考にした。偉い人がたくさんいてすごいよね。