CentOS5 で Ruby + PostgreSQL + DBI を使う
簡単にできると思ったら意外にハマったのでメモ。
- yum install ruby で ruby を入れる
- 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 認証にてすべてのデータベースにアクセスできるようにする場合)。
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 になおして使ったほうがよさげ。
なお、下のページを参考にした。偉い人がたくさんいてすごいよね。