CouchDBにRubyでアクセスしてみる
RubyでCouchDBにアクセスし、データの登録や取得を行うサンプルです。
- CouchDBのインターフェイスはHTTPになっていて、GETやPUTで値の取得や登録ができます。
- Ruby用のアクセスライブラリもいくつかあるようですが、HTTPでアクセスするだけならhttpclientでさくっと作れるよなー、ということで、このへんも参考にしつつ自作してみました。内部動作の把握にもなるしね。
require 'rubygems' require 'httpclient' require 'json/lexer' # CouchDBクライアント module CouchDB class Client def initialize(host, proxy=ENV["http_proxy"]) @host = host @client = HTTPClient.new( proxy, "http client." ) end def delete(uri, value=nil) request( :delete, uri, value.to_json) end def get(uri) request( :get, uri) end def head(uri) begin request( :head, uri) return true rescue return false if $!.to_s =~/^404/ raise $! end end def put(uri, value) request( :put, uri, value.to_json) end def post(uri, value) request( :put, uri, value.to_json) end def request(method,uri,body=nil) res = @client.request( method, "#{@host}/#{uri}", body ? {"content-type"=>"application/json"} : nil, body) error( res, method, uri, body ) if res.status >= 400 JSON::Lexer.new(res.content).nextvalue if res.content rescue nil end private def error( res, method, uri, body ) message = "" if res.content parsed = JSON::Lexer.new(res.content).nextvalue message = "#{parsed["error"]} : #{parsed["reason"]}" if parsed end raise "#{res.status} : #{method} #{uri} #{message} \n#{body}" end end end # データベースに接続 c = CouchDB::Client.new("<接続先ホスト 例 http://foo.com:5984>") # バージョン情報の取得 p c.get("") # データベース「kittens」の作成。 p c.put("/kittens/", "") # データの登録 p c.put("/kittens/mii", {"name"=>"mii","age"=>1}) p c.put("/kittens/tora", {"name"=>"tora","age"=>0}) p c.put("/kittens/shiro", {"name"=>"shiro","age"=>2}) # データの取得 p c.get("/kittens/mii") p c.get("/kittens/tora") p c.get("/kittens/shiro") p c.get("/kittens") # データの存在確認 p c.head("/kittens/mii") p c.head("/kittens/tora") p c.head("/kittens/shiro") p c.head("/kittens") p c.head("/kittens/not_found") # データベースの削除 p c.delete("/kittens/")
実行結果です。
{"couchdb"=>"Welcome", "version"=>"0.8.0-incubating"} {"ok"=>true} {"rev"=>"596249955", "id"=>"mii", "ok"=>true} {"rev"=>"1956080563", "id"=>"tora", "ok"=>true} {"rev"=>"628025366", "id"=>"shiro", "ok"=>true} {"name"=>"mii", "_rev"=>"596249955", "_id"=>"mii", "age"=>1} {"name"=>"tora", "_rev"=>"1956080563", "_id"=>"tora", "age"=>0} {"name"=>"shiro", "_rev"=>"628025366", "_id"=>"shiro", "age"=>2} {"update_seq"=>3, "doc_count"=>3, "disk_size"=>14772, "compact_running"=>false, "db_name"=>"kittens", "doc_del_count"=>0} true true true true false {"ok"=>true}
さくっと使えますねー。かっちょいい。