Ubuntu 9.10 (Karmic Koala) で Ruby + PostgreSQL な環境を構築する (DBI/DBD-Pg 使用)

以前も 似たような記事 を書きましたが、今回は Ruby から PostgreSQL を使用するためのライブラリとして ruby-pg ではなく DBI / DBD-Pg を使う方法 *1 を採ります。

インストールするバージョン等

OS は、タイトルにも書いてあるように Ubuntu 9.10 (Karmic Koala) です。

RubyPostgreSQL はそれぞれ以下のバージョンをインストールします。 インストールには apt-get コマンドを使用します。

また、Ruby ライブラリ DBI および DBD-Pg のインストールには RubyGems (Ruby 用ライブラリ管理ツール) を使用します。 RubyGems および DBI、DBD-Pg のバージョンは以下のものがインストールされました。

インストール

早速インストールを行っていきます。 Ruby および PostgreSQL は apt-get を使用してインストールしますので、端末を開き以下のコマンドを入力 *2 してください。

$ sudo apt-get install ruby1.9.1-full rubygems1.9.1 postgresql libpq-dev

これで Ruby 1.9.1 と PostgreSQL が使用可能になります。

引き続いて、RubyGems を使用して DBI と DBD-Pg をインストールします。 同じように端末で以下のようにコマンドを入力してください。

$ sudo gem1.9.1 install dbi dbd-pg

これでインストールは完了です。 ここから先は簡単な使用方法を書いていきます。

PostgreSQL の設定

PostgreSQL の設定を行います。 まずはPostgreSQL に接続するときに使用するユーザーを作成します。 下記コマンドを入力すると、testuser という名前のユーザーがパスワードつきで作成されます。 パスワードや、権限をどうするかなどを聞かれますが、適当に答えてください。 ここではテスト用ユーザーなので、パスワードを p8ssw0rd とし、権限関係はすべて no と答えたとして進めていきます。

$ sudo -u postgres createuser -P testuser

次に、ユーザー testuser 用のデータベースを作成します。 データベース名は testdb とします。

$ sudo -u postgres createdb -E UNICODE -O testuser testdb

これで、PostgreSQL のユーザーとデータベースが作成されました。 次に、PostgreSQL のユーザー認証方式の設定を行います。 下記コマンドを入力し、編集画面を出します。 テキストエディタ vi に慣れていない場合は、vi のところを gedit とすると GUI エディタが起動するのでそちらを使用してください。

$ sudo vi /etc/postgresql/8.4/main/pg_hba.conf

このファイルの下の方に、以下のような記述があると思います。

(略)

# Database administrative login by UNIX sockets
local all postgres ident

# TYPE DATABASE USER CIDR-ADDRESS METHOD

# "local" is for Unix domain socket connections only
local all all ident
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5

この中で、強調表示している行を以下のように変更します。

local   all         all                               md5

このように変更することで、もともと OS のユーザーと同一かどうかの判定によるユーザー認証を行っていたのがパスワード入力によるユーザー認証に変わります。 この変更をしないと、psql コマンドによって PostgreSQL に接続しようとしても以下のようなメッセージが表示されて接続できません *3

psql: FATAL:  ???"testuser"?Ident?????????

詳しくは PostgreSQL の公式ドキュメントを読んでください。

接続してみる

設定が終わったので、psql コマンドを使って PostgreSQL に接続してみます。 まず、設定の変更を反映するために PostgreSQL の再起動を行います。

$ sudo service postgresql-8.4 restart

再起動が完了したら、下記コマンドで PostgreSQL に接続します。

$ psql testdb -U testuser

特にエラーメッセージが表示されなければおっけーです。 PostgreSQL の対話型環境に移行しますので、ここで各種 SQL を使用して table を作成したり検索したりできます。 対話型環境から抜ける場合は \q コマンドを使用してください。

Ruby から PostgreSQL に接続する

Ruby から PostgreSQL への接続は、先ほどインストールした DBI / DBD-Pg を使用します。 DBI というのは、全ての DBMS を同じ API で操作できるようにするためのラッパーで、実際に DBMS に接続し操作を行うのは DBD です。 PostgreSQL 用の DBD が DBD-Pg というわけです。

# -*- coding: utf-8 -*-
# PostgreSQL に接続するテスト

# DBI ライブラリの読み込み
require "dbi"

begin
# PostgreSQL サーバへ接続
dbh = DBI.connect( "dbi:Pg:testdb:localhost", "testuser", "p8ssw0rd" )
# サーババージョンの文字列を取得して、表示する。
row = dbh.select_one( "SELECT VERSION()" )
puts "Server version: " + row[0]
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
ensure
# サーバから切断
dbh.disconnect if dbh
end

上のような Ruby コードを作成し、実行すると、問題がなければ PostgreSQL のバージョンが表示されるはずです。 なお、ruby1.9.1-full パッケージにより Ruby 1.9.1 をインストールした場合の ruby のコマンドは ruby1.9.1 ですのでご注意ください。

*1:DBD-Pg も中では ruby-pg を使っているようなので結局中身的には同じですが、他の DBMSDBI を使って同じ API で操作できる、という点ではこちらの手法のほうが良いのではないかと思います。

*2:もちろん Synaptic パッケージ・マネージャを使用してもかまいません。

*3:正確に言うと、OS のユーザー名と PostgreSQL のユーザー名が一致していないと接続できません。 OS のユーザー名と PostgreSQL のユーザー名が一致している場合に接続できます。