PostgresPRを使ってみた

簡単な使い方を忘れないうちに。あと列名でアクセスできるようなModuleも作ってみた。

require 'postgres-pr/connection'  # gemから取得

# 列名でアクセスできるようにするモジュール
# character encodings differ: UTF-8 and ASCII-8BIT (ArgumentError)対策もしてみた
col_accessor = Module.new {|mod|
  mod.module_eval {
    @@fields = {}
    def self.extended(obj)
      if obj.is_a? PostgresPR::Connection::Result then
        undef_method(*@@fields.keys)
        obj.fields.each_with_index {|f,i|
          @@fields[f.name] = i
        }
      else
        @@fields.each {|name,i|
          define_method(name.to_sym) {
            s = self[i]
            (s.is_a? String) ? s.force_encoding('UTF-8') : s
          }
        }
      end
    end
  }
}


# URLは tcp://(HOST):(PORT) か unix:(ソケットのパス) の形式
# ソケットのパスは /tmp/.s.PGSQL.5432 とか /var/run/postgresql/.s.PGSQL.5432 とか
pg = PostgresPR::Connection.new(DB名, USER名, PASSWORD, URL)

pg.query('SELECT id,name FROM hoge').extend(col_accessor).rows.each {|r|
  r.extend(col_accessor) # これで r.id とか r.name でアクセスできるようになる
  …
}

pg.close

列名が重複してたときとか、メソッドに使えない文字が入ってたときとかの処理はしてないけどサクっと書くぶんにはこれで十分かなと。