lispとrubyとpythonと その9 DBアクセス(common lisp)
CommonLispでDBアクセスというとclsql。
いつもどおりasdfで入れて。。。と思ったが、依存関係があるのかうまく入らない。
DB関連だからしょうがないのかなぁと、Synapticパッケージマネージャで入れた。
DBはMySQLで。。。としてたんだけど、プリペアドステートメントが通らない。
どうもMySQLだとダメみたい。
プリペアドステートメント使えないってちょっとありえないのでPostgreに乗り換えを試みる・・・。
中途半端だけど途中までやったのがこちら。↓
;;マニュアルはここ ;;http://clsql.b9.com/manual/ (require 'clsql) (let ((con nil)) (unwind-protect (progn ;;connectionのopen ;;if-exitsはコネクションプールの扱い ;;:oldは古いのを使いまわす ;;参考 ;;http://d.hatena.ne.jp/yuki_neko_nyan/20070901/clsql (setf con (clsql-sys:connect '("localhost" "test_db" "test_user" "p") :if-exists :old :database-type :mysql)) ;;トランザクション開始 (clsql-sys:start-transaction :database con) ;;insert (clsql-sys:execute-command "insert into tb0 values (0,'あああああ','いいいいい')" :database con) ;;select (mapc #'(lambda (lst) (format t "~A~%" lst)) (clsql-sys:query "select * from tb0" :database con)) ;;update (clsql-sys:execute-command "update tb0 set data1='ううううう'" :database con) ;;select (mapc #'(lambda (lst) (format t "~A~%" lst)) (clsql-sys:query "select * from tb0" :database con))) (if con (progn (format t "rollback~%") ;;rollback 更新してしまうと面倒だから戻す (clsql-sys:rollback :database con) ;;切断 (clsql-sys:disconnect :database con))))) ;;->(0 あああああ いいいいい) ;; (0 ううううう いいいいい) ;; rollback ;;with系を使ってみる (clsql-sys:with-database (con '("localhost" "test_db" "test_user" "p") :if-exists :old :database-type :mysql) (clsql-sys:with-transaction (:database con) (mapc #'(lambda (lst) (format t "~A~%" lst)) (clsql-sys:query "select * from tb1" :database con)))) ;;->(0 あああああ いいいいい) ;; (1 ううううう えええええ) ;;preparedstatement (clsql-sys:with-database (con '("localhost" "test_db" "test_user" "p") :if-exists :old :database-type :mysql) (setf stmt (clsql-sys:prepare-sql "select * from tb0 where id = ?" '(int) :database con))) ;; (format t stmt)))) ;;プリペアドステートメントは実装されてない??? ;;MySQLだからか?? ;;A database error occurred: NIL / NIL ;; DATABASE-PREPARE not implemented for #<CLSQL-MYSQL:MYSQL-DATABASE localhost/test_db/test_user OPEN {BB92501}> ;; [Condition of type CLSQL-SYS:SQL-DATABASE-ERROR]