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 ファイルである。
0 件のコメント:
コメントを投稿