Ruby の RDBI で PostgreSQL にアクセスしてみた

このエントリーをはてなブックマークに追加
はてなブックマーク - Ruby の RDBI で PostgreSQL にアクセスしてみた
Share on Facebook
Post to Google Buzz
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip
Share on FriendFeed

Ruby から DB にアクセスするライブラリとして Ruby/DBI が有名なようですが、 RubyGems で dbi を検索したら、 RDBI が見つかったので、ちょっとそれを使ってみようと思いました。
GitHub のページ にある README の冒頭を Google 翻訳の力を借りて読んでみると、「RDBI は、 Ruby エコシステムの重いデータベースレイヤーの代わりの物になる事が主目的」のようですね。
今のデータベース層は、重いので、軽くするために作り直しているプロジェクトと言う事ですかね。

環境は、 PC-BSD 8.2 i386、 Ruby 1.8.7、「RubyGems をユーザーのディレクトリにインストールしてみた」でインストールした RubyGems 1.8.2、「PC-BSD に PostgreSQL を入れてみた」の時の PostgreSQL 9.0.4 です。

インストール

RDBI 自体は、すんなり入りました。

> gem18 install rdbi
Fetching: methlab-0.1.0.gem (100%)
Fetching: epoxy-0.3.1.gem (100%)
Fetching: typelib-0.1.0.gem (100%)
Fetching: rdbi-0.9.1.gem (100%)
Successfully installed methlab-0.1.0
Successfully installed epoxy-0.3.1
Successfully installed typelib-0.1.0
Successfully installed rdbi-0.9.1
4 gems installed
Installing ri documentation for methlab-0.1.0...
Installing ri documentation for epoxy-0.3.1...
Installing ri documentation for typelib-0.1.0...
Installing ri documentation for rdbi-0.9.1...
Installing RDoc documentation for methlab-0.1.0...
Installing RDoc documentation for epoxy-0.3.1...
Installing RDoc documentation for typelib-0.1.0...
Installing RDoc documentation for rdbi-0.9.1...

PostgreSQL のドライバ rdbi-driver-postgresql は、色々やってみた結果、
PostgreSQL の bin にパスを通せば、インストールできました。

> set path = ($path /opt/pgsql9.0/bin)
> gem18 install rdbi-driver-postgresql
Fetching: pg-0.9.0.gem (100%)
Building native extensions.  This could take a while...
Fetching: rdbi-driver-postgresql-0.9.1.gem (100%)
Successfully installed pg-0.9.0
Successfully installed rdbi-driver-postgresql-0.9.1
2 gems installed
Installing ri documentation for pg-0.9.0...
Installing ri documentation for rdbi-driver-postgresql-0.9.1...
Installing RDoc documentation for pg-0.9.0...
Installing RDoc documentation for rdbi-driver-postgresql-0.9.1...

rdbi-driver-postgresql が依存している pg のネイティブのライブラリのコンパイルの際、 pg_config コマンドで include や lib のパスを取っています。

サンプルの実行

サンプルの実行前に PostgeSQL の lib をダイナミックリンクライブラリの検索パスに設定します。

> setenv LD_LIBRARY_PATH /opt/pgsql9.0/lib

README のサンプルは、 sqlite3 のドライバーを使ってるようだけど、接続の所さえ書き換えれば PostgreSQL でも動くはずです。
require が書いてないのは、問題にならない所だからだろうと思ってましたが、そこが問題でした。
取り合えず、次のように書いたら動きました。

require 'thread'

require 'rubygems'
require 'rdbi'
require 'rdbi-driver-postgresql'


# connect to an PostgreSQL database:
dbh = RDBI.connect(RDBI::Driver::PostgreSQL, 
        :user => "postgres",
        :database => "test")

# execute this CREATE TABLE statement:
dbh.execute("create table tbl (string varchar(32), number integer)")

# prepare an insert statement for execution with two placeholders:
dbh.prepare("insert into tbl (string, number) values (?, ?)") do |sth|

    # and execute it three times with bound variables:
    sth.execute("foo", -37)
    sth.execute("bar", 127)
    sth.execute("quux", 1024)
end

# get a result handle from a select statement:
result = dbh.execute("select * from tbl")

# and fetch the first row
p result.fetch(:first) # ["foo", -37]

RubyGems でインストールしたので、当然 require 'rubygems' を入れます。

RDBI.connect で指定したドライバーのライブラリを require してくれるのかと思ってましたが、してくれないようです。
事前に require 'rdbi-driver-postgresql' 等と使うドライバーを require しておかないと、そんなクラス無いっていうエラーになりました。

あと、次のような Mutex が見つからないというエラーが出ましたが、最初に require 'thread' をしたら、出なくなりました。

/home/hunyosi/local/rubygems/gems/gems/rdbi-0.9.1/lib/rdbi/pool.rb:17: uninitialized constant RDBI::Pool::Mutex (NameError)
        from /home/hunyosi/local/rubygems/lib/rubygems/custom_require.rb:36:in `gem_original_require'
        from /home/hunyosi/local/rubygems/lib/rubygems/custom_require.rb:36:in `require'
        from /home/hunyosi/local/rubygems/gems/gems/rdbi-0.9.1/lib/rdbi.rb:172
        from /home/hunyosi/local/rubygems/lib/rubygems/custom_require.rb:59:in `gem_original_require'
        from /home/hunyosi/local/rubygems/lib/rubygems/custom_require.rb:59:in `require'
        from rdbi-pgsql.rb:2

RDBI.connect() の最初の引数は、ドライバーのクラス名(RDBI::Driver::PostgreSQL 等)、またはクラス名のシンボル(:PostgreSQL 等)で、2つ目以降の引数は、ドライバーのクラスのコンストラクタに渡されます。
RDBI::Driver::PostgreSQL の場合の引数は、次のようになっています。

:host => ” または :hostname => ” ホスト名
:port => 0 ポート番号
:options => ” オプション文字列
:tty => ” デバッグメッセージ?(最近のバージョンでは無効?)
:dbname => ” または :database => ” または :db => ” データベース名
:user => ” または :username => ” ユーザー名
:password => ” または :auth => ” パスワード

引数は、単純に PGconn.new に渡されているようですので、PGconn の new の説明もご参照ください。

カテゴリー: 未分類   タグ: , ,   この投稿のパーマリンク