Ubuntu 9.10 (Karmic Koala) で Ruby + PostgreSQL な環境を構築する (DBI/DBD-Pg 使用)
以前も 似たような記事 を書きましたが、今回は Ruby から PostgreSQL を使用するためのライブラリとして ruby-pg ではなく DBI / DBD-Pg を使う方法 *1 を採ります。
インストールするバージョン等
OS は、タイトルにも書いてあるように Ubuntu 9.10 (Karmic Koala) です。
Ruby、PostgreSQL はそれぞれ以下のバージョンをインストールします。 インストールには apt-get コマンドを使用します。
- Ruby 1.9.1
- PostgreSQL 8.4
また、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 を使っているようなので結局中身的には同じですが、他の DBMS も DBI を使って同じ API で操作できる、という点ではこちらの手法のほうが良いのではないかと思います。
*2:もちろん Synaptic パッケージ・マネージャを使用してもかまいません。
*3:正確に言うと、OS のユーザー名と PostgreSQL のユーザー名が一致していないと接続できません。 OS のユーザー名と PostgreSQL のユーザー名が一致している場合に接続できます。