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 の説明もご参照ください。