Contents

こんにちは。
胃弱体質なりょうのすけです。(今これ書いてるときすごく痛い)

ひきつづき、CouchDB に浮気中。

インストールしただけの前回
今回は使ってみますよ。

簡単です、それはもう簡単すぎて泣ける。
↓ここを参考に
http://guide.couchdb.org/editions/1/en/api.html

サーバーの確認

CouchDB が問題なく実行されているか確認。
ターミナルから cURL で送信する。
CouchDB のデフォルトのアドレスは 127.0.0.1:5984
(couch.ini で設定を変更できる)

$ curl http://127.0.0.1:5984/
{"couchdb":"Welcome","version":"1.1.0"}

使用しているバージョンが表示されるよ。
りょうのすけは 1.1.0 ですね。

ウワサによると1.0.3と1.1.0にはバグがあるっぽい。
現時点(9/30)ではあくまでもウワサなので詳細がわかれば何か書きます。

CouchDB を操作するには HTTPメソッドを使用する。
PUT GET POST DELETE など。

データベースの作成

とりあえず作ってみよう。
なんとなくブックマークを保存するデータベースにしてみる。
ターミナルから『bookmarks』データベースを作成。

$ curl -X PUT http://127.0.0.1:5984/bookmarks
{"ok":true}

できた

ちなみに -v オプションをつけると応答の詳細を表示しつつ実行される。

$ curl -vX PUT http://127.0.0.1:5984/bookmarks
* About to connect() to 127.0.0.1 port 5984 (#0)
*   Trying 127.0.0.1... connected
> PUT /bookmarks HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-apple-darwin10.8.0) libcurl/7.22.0 OpenSSL/1.0.0e zlib/1.2.5 libidn/1.22
> Host: 127.0.0.1:5984
> Accept: */*
>
< HTTP/1.1 201 Created
< Server: CouchDB/1.1.0 (Erlang OTP/R14B03)
< Location: http://127.0.0.1:5984/bookmarks
< Date: Thu, 29 Sep 2011 20:33:28 GMT
< Content-Type: text/plain;charset=utf-8
< Content-Length: 12
< Cache-Control: must-revalidate
<
{"ok":true}
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0

削除する場合は DELETE メソッドを使用。

$ curl -vX DELETE http://127.0.0.1:5984/bookmarks
* About to connect() to 127.0.0.1 port 5984 (#0)
*   Trying 127.0.0.1... connected
> DELETE /bookmarks HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-apple-darwin10.8.0) libcurl/7.22.0 OpenSSL/1.0.0e zlib/1.2.5 libidn/1.22
> Host: 127.0.0.1:5984
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: CouchDB/1.1.0 (Erlang OTP/R14B03)
< Date: Thu, 29 Sep 2011 20:35:53 GMT
< Content-Type: text/plain;charset=utf-8
< Content-Length: 12
< Cache-Control: must-revalidate
<
{"ok":true}
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0

ドキュメントの操作

ドキュメントの挿入

ドキュメントを挿入するには PUT メソッドを使用する。

$ curl -X PUT http://127.0.0.1:5984/DATABASE/ID -d '{ *json_data* }'

なので

$ curl -X PUT http://127.0.0.1:5984/bookmarks/6e1295ed6c29495e54cc05947f18c8af -d '{"title":"rnsklabs", "url":"http://rnsk.net","comment":"りょうのすけの研究室"}'
{"ok":true,"id":"6e1295ed6c29495e54cc05947f18c8af","rev":"1-475397faa2309472586554ace8851916"}

ドキュメントが保存された。

※ここで注意
CouchDB には MySQL のようにオート・インクリメント機能はないので ID は自分で指定することになる。
ID には任意の文字列が指定できるけど UUID(もしくは GUID)を使用するのが妥当。

ちなみに CouchDB は UUID の生成を手助けしてくれる。
↓これを入力

$ curl -X GET http://127.0.0.1:5984/_uuids

↓返ってくる

{"uuids":["122768b543327e288c9b76356a000b04"]}

親切。

ドキュメントの取得

保存したドキュメントを取得するには GET メソッドを使用する。

$ curl -X GET http://127.0.0.1:5984/DATABASE/ID

なので

$ curl -X GET http://127.0.0.1:5984/bookmarks/6e1295ed6c29495e54cc05947f18c8af
{"_id":"6e1295ed6c29495e54cc05947f18c8af","_rev":"1-475397faa2309472586554ace8851916","title":"rnsklabs","url":"http://rnsk.net","comment":"u308au3087u3046u306eu3059u3051u306eu7814u7a76u5ba4"}

保存の際のドキュメント以外に『_rev』という項目が追加されている。
勝手に!?(違

これはリビジョンを表してるもので、保存後のドキュメント操作に使用します。

ドキュメントを更新する

更新も PUT メソッドを使用します。

$ curl -X PUT http://127.0.0.1:5984/bookmarks/6e1295ed6c29495e54cc05947f18c8af -d '{"title":"rnsklabs", "url":"http://rnsk.net","comment":"りょうのすけの研究室です"}'

↑これだと↓エラー

{"error":"conflict","reason":"Document update conflict."}

リビジョンを指定して更新する

$ curl -X PUT http://127.0.0.1:5984/bookmarks/6e1295ed6c29495e54cc05947f18c8af -d '{"_rev":"1-475397faa2309472586554ace8851916","title":"rnsklabs", "url":"http://rnsk.net","comment":"りょうのすけの研究室です"}'

↑これなら↓OK

{"ok":true,"id":"6e1295ed6c29495e54cc05947f18c8af","rev":"2-79499280a4ec15d17ff52d3972762ea0"}

これが普段 RDB で使ってるIDの役目になるのかな?という感じ。

ファイルを添付する

CouchDBでは、1つのドキュメントに複数の添付ファイルをひも付けして管理することができます。
画像ファイルやテキストファイル、圧縮ファイルなどなど。
ファイルを添付するときも PUT メソッドを使用。
すでに保存しているドキュメントに添付します。

$ curl -X PUT http://127.0.0.1:5984/bookmarks/6e1295ed6c29495e54cc05947f18c8af/screenshot.jpg?rev=2-79499280a4ec15d17ff52d3972762ea0 --data-binary @screenshot.jpg -H "Content-Type: image/jpg"

@ のあとのファイル名は添付したいファイルのパスを書きます。
Mac のデスクトップにあるなら
@/Users/ユーザー名/Desktop/screenshot.jpg

添付された

ドキュメントの削除

ドキュメントの削除には DELETE メソッドを使用する。
このときも更新と同じようにリビジョンを指定しないとエラーになる

$ curl -X DELETE http://127.0.0.1:5984/bookmarks/6e1295ed6c29495e54cc05947f18c8af

↑こうだと↓エラー

{"error":"conflict","reason":"Document update conflict."}
$ curl -X DELETE http://127.0.0.1:5984/bookmarks/6e1295ed6c29495e54cc05947f18c8af?rev="2-79499280a4ec15d17ff52d3972762ea0"

↑これなら↓OK

{"ok":true,"id":"6e1295ed6c29495e54cc05947f18c8af","rev":"3-4f7b6f044ac61ea6e10136ff3b1d848e"}

ドキュメントが消えた。

おわりに

ドキュメント操作はとりあえずこんな感じ。
わざわざ cURL を使わなくても Futon 使ったらもっとラクラクですよね。

次回は Futon 使ってドキュメント操作してみようかな。

Comments are closed.