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によるパスワード認証じゃないとダメだよ、ということじゃないかと自分は納得しました。