2011年12月8日木曜日

pg (ruby-pg) の使い方

pg の備忘録

pg ( ruby-pg)  は PostgreSQL の API (libpq) を ruby から使うための拡張モジュール。使い方を忘れても、ri PGconn  すれば必要最低限のことは出てくる。

接続

ri PGconn するとでてくる接続方法がこれ
conn = PGconn.open :dbname =>'hoge', :user => 'hoge_db_user',
                   :host => 'huge_db_server', :password => 'secret'
dbname, user, host, password の情報をハッシュで与えればよい。また、接続パラーメタを文字列で与えることもできる
conn = PGconn.open 'dbname=hoge user=hoge_db_user host=hoge_db_server password=secret'

接続先を指定しない場合ローカルの Unix ドメインソケットでの接続を試みる。ri PGconn.open ではなく、ri PGconn.new で調べると詳しくでてくる (pg-0.11-0 の場合)。また libpq のドキュメントも参考になる。

問い合わせ

PGconn で作った DB 接続用のオブジェクトを介して SQL を実行する。
res = conn.exec "select * from foo where ....."
res.result_status で SQL 文の終了コードを取得 (ri PGresult 参照)、 ヒットした行数は res.ntuples で取れる。res は PGresult (PG::Result) のインスタンスで、ハッシュを要素としてもつ配列の様にアクセスすることができる。問い合わせ結果に hoge というカラムがある場合であれば、
(0...res.ntuples).each {|i| puts res[i]["hoge"]}
でマッチした res.ntuples 行の hoge にアクセス(表示)できる。

PGresult (PG::Result) インスタンスの振る舞いが配列と違う例として、[] の引数にとれるものが Fixnum だけで Range オブジェクトを取れないことが挙げられる。例えば以下のように [] に Range を渡してもエラーとなる:
res[0...res.ntuples]
もっとも、 PGresult (PG::Result) は Enumerable なので、 map で Array に変換すれば Range を扱うことができる:
res.map{|r| r}[0...res.ntuples]
PGresult(PG::Result) のインスタンスメソッドは他にもあり、ri で全て説明されているが、使い方を手っ取り早く見たい場合は Rspec を読むのもよい。pg-0.14 であれば spec/pg/result_spec.rb が PG::Result の Rspec ファイルである。

最近の pg (追記)

pg-0.14 で ri PGconn したら、情報が出てこなかった。最近ネームスペースの切り方を変えたようで、例えば PGConn の実態は PG::Connection という新しいクラスとして定義されている。PGconn 自体は今でも使えるが、 ri PGConn では見れないようだ。そんな時は ri PG::Connection ri PG::Result などで調べればよい。

0 件のコメント:

コメントを投稿