2007/08/20

[Common Lisp] PostgreSQL に Postmodern でアクセスする

Common Lisp で DB アクセスするなら CLSQL が定番ですが、PostgreSQL 限定ならよりかゆいところに手がとどく Postmodern がおすすめです。
text タイプやオートナンバ等が使えます。

#|
sudo -u postgres createuser -P
ancient/password
|#


(eval-when (:load-toplevel :compile-toplevel :execute)
(require :postmodern))

(defparameter *db* "ancient")
(defparameter *user* "ancient")
(defparameter *passwd* "password")
(defparameter *host* "localhost")

(postmodern:with-connection (*db* *user* *passwd* *host*)

(print (postmodern:query "select 'あ'")) ; query

(postmodern:deftable table1 () ; defclass と似た感じでテーブル定義
((field1 :accessor field1 :type string :initarg :field1))
(:class-name table1)
(:auto-id t)) ; オートナンバ

(defmethod print-object ((table1 table1) stream)
(print-unreadable-object (table1 stream :type t :identity t)
(format stream "~a: ~a" (postmodern:get-id table1) (field1 table1))))

(ignore-errors
(postmodern:drop-table 'table1)) ; テーブル削除(エラーは無視)
(postmodern:create-table 'table1) ; テーブル作成

(loop for i from 1 to 5
do (postmodern:save-dao ; インサート
(make-instance 'table1 :field1 (format nil "あいう~a" i))))

(let ((x (postmodern:get-dao 'table1 3))) ; プライマリキーで select
(print x)
(setf (field1 x) "修正")
(postmodern:save-dao x)) ; 更新

(let ((x (car (postmodern:select-dao 'table1 (:= 'field1 "修正")))))
(print x)
(postmodern:delete-dao x)) ; 削除

(print (postmodern:query "select * from table1"))
)

ところで Emacs の htmlize を使ってみました。

0 件のコメント: