Rubyから PostgreSQLを使う

 
Rubyから PostgreSQLを使おうとして、ちょっとつまづいたので、後進の人のためにメモ。
入れようとした環境はこんな感じ。

  • Ubuntu 9.04(サーバ版)
  • ruby 1.8.7
  • Rails (2.1.0) + passenger (2.0.1)
  • psql (PostgreSQL) 8.3.9

つまり、少し古い Rubyと Railsが動いていて、かつ、PostgreSQLも動いていて、いま動いているものは変えたくないということ。
 

やったことはこんなこと。
1.なぜか、gemが入っていなかったので、インストール。(一応、古い方にしてみた)

# apt-get install rubygems1.8

# gem list --local
*** LOCAL GEMS ***
actionmailer (2.1.0)
actionpack (2.1.0)
          :
          :

やっぱ、入ってたんだと思うんだけど。
 
2.libpq-devもインストール。

# apt-get install libpq-dev

 
3.いよいよ、dbiをインストール。

# gem install dbi
Updating metadata for 1 gems from http://gems.rubyforge.org/
.
complete
ERROR:  could not find dbi locally or in a repository

# gem update
Updating installed gems
Updating metadata for 1 gems from http://gems.rubyforge.org/
.
complete
Nothing to update

ここでつまづく。ないってどうよ?
updateしてないかもと思って、やってみたけど、おかしいところはなし。
apt-get update はちょっとやりたくないので、以下、レポジトリに頼らずにインストールする。

# wget http://rubygems.org/downloads/dbi-0.4.5.gem
# wget http://rubygems.org/downloads/deprecated-2.0.1.gem

# gem install deprecated-2.0.1.gem --local
Successfully installed deprecated-2.0.1
1 gem installed
Installing ri documentation for deprecated-2.0.1...
Installing RDoc documentation for deprecated-2.0.1...

# gem install dbi-0.4.5.gem --local
Successfully installed deprecated-3.0.0
Successfully installed dbi-0.4.5
2 gems installed
Installing ri documentation for deprecated-3.0.0...
Installing ri documentation for dbi-0.4.5...
Installing RDoc documentation for deprecated-3.0.0...
Installing RDoc documentation for dbi-0.4.5...

 
4.次は、dbd-pgをインストール。これもレポジトリに頼らずに。

# wget http://rubygems.org/downloads/dbd-pg-0.3.9.gem
# wget http://rubygems.org/downloads/pg-0.9.0.gem

# gem install pg-0.9.0.gem --local
Building native extensions.  This could take a while...
Successfully installed pg-0.9.0
1 gem installed
Installing ri documentation for pg-0.9.0...
Installing RDoc documentation for pg-0.9.0...

# gem install dbd-pg-0.3.9.gem --local
Successfully installed dbd-pg-0.3.9
1 gem installed
Installing ri documentation for dbd-pg-0.3.9...
Installing RDoc documentation for dbd-pg-0.3.9...

これで、ようやっと、インストール完了。
 
5.irbでテスト。

# irb

> require 'rubygems'
> require 'dbi'
> dbh = DBI.connect("dbi:Pg:test_db:localhost", "test_db_user", "testpassword")
DBI::OperationalError: FATAL:  password authentication failed for user "test_db_user"

「psql test_db -U test_db_user -W」でちゃんと通るパスワード入れてるのにエラーではじかれた。
違うユーザ使ったらOKになったので、きっと grantの関係だと思うがまだ調べてない。
 
調べた。きっとココだと思う。

# e /etc/postgresql/8.3/main/pg_hba.conf

local   all  postgres            ident sameuser
local   all  test_db_user      trust
local   all  all                     trust
host   all  all  127.0.0.1/32  md5
# psql test_db -U postgres

psql: FATAL:  Ident authentication failed for user "postgres"

postgresは ident認証がかかっているので、エラーになる。(ログインしようと思ったら、su postgres でユーザを切り替える)
これでいくと、test_db_userは trustになっているので、ダメなのではないかと。
DBI.connect はリモート接続だから、md5によるパスワード認証じゃないとダメだよ、ということじゃないかと自分は納得しました。