Edited at

ChillaxでCouchDBを使う

More than 5 years have passed since last update.

Chillaxを使うと簡単にCouchDBを利用できます。


chillax.lisp

;; サーバオブジェクトを作る

(defparameter *server*
;; yason-serverはJSONをYASONでエンコード・デコードする
(make-instance 'chillax:yason-server
;; JSONをalistにデコードする
:object-as-alist-p t
;; JSONオブジェクトのキーをキーワードシンボルに変換する
:parse-object-key-fun (lambda (x) (intern x :keyword))))

;; データベースの一覧をリストで
(chillax:all-dbs *server*)
;=> ("_replicator" "_users"),
; :OK

;; データベースにアクセスするときはensure-dbで
;; 存在しない場合は自動的に作られる
(defparameter *db* (chillax:ensure-db *server* "test"))

;; testというデータベースが作成された
(chillax:all-dbs *server*)
;=> ("_replicator" "_users" "test"),
; :OK

;; データベースに属するドキュメントの一覧をリストで
;; まだドキュメントは存在しない
(chillax:all-documents *db*)
;=> ((:|rows|) (:|offset| . 0) (:|total_rows| . 0))

;; ドキュメントをPOSTメソッドで追加する
(chillax:post-document *db* '((:x . 0) (:y . 1)))
;=> ((:|rev| . "1-2c7bf904079545d844eaecd6b2b86324")
; (:|id| . "2aad3ee4a1b1be1f1d746629f1001e2b") (:|ok| . T))

;; 作成したドキュメントが増えている
(chillax:all-documents *db*)
;=> ((:|rows|
; ((:|value| (:|rev| . "1-2c7bf904079545d844eaecd6b2b86324"))
; (:|key| . "2aad3ee4a1b1be1f1d746629f1001e2b")
; (:|id| . "2aad3ee4a1b1be1f1d746629f1001e2b")))
; (:|offset| . 0) (:|total_rows| . 1))

;; ドキュメントの内容を得る
(chillax:get-document *db* "2aad3ee4a1b1be1f1d746629f1001e2b")
;=> ((:Y . 1) (:X . 0) (:|_rev| . "1-2c7bf904079545d844eaecd6b2b86324")
; (:|_id| . "2aad3ee4a1b1be1f1d746629f1001e2b"))

;; ドキュメントを更新する
(let* ((id "2aad3ee4a1b1be1f1d746629f1001e2b")
(rev `(:|_rev| . ,(chillax:get-document-revision *db* id))))
(chillax:put-document *db* id `(,rev (:x . 1) (:y . 2))))
;=> ((:|rev| . "2-e5db5dc048432fb2c980de010d280645")
; (:|id| . "2aad3ee4a1b1be1f1d746629f1001e2b") (:|ok| . T))

;; 内容が変更されている
(chillax:get-document *db* "2aad3ee4a1b1be1f1d746629f1001e2b")
;=> ((:Y . 2) (:X . 1) (:|_rev| . "2-e5db5dc048432fb2c980de010d280645")
; (:|_id| . "2aad3ee4a1b1be1f1d746629f1001e2b"))


注意点としては、現時点の最新リビジョンではDrakmaのurl-encode関数と干渉する不具合があります。開発者も問題は把握していて、一応GitHubに報告もしているので、近いうちに修正はされると思われます。