(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

Clojure で org.clojure/java.jdbc を使うときにぷちハマりした

Web Development with Clojure を読みながら。
だいたいこの本で使われているライブラリのバージョン古いので最新のものを使って書きながら読み進めているのだけど、見事にハマったよね。

こんなエラーが出る。

1. Caused by java.lang.RuntimeException
   No such var: sql/with-connection

ライブラリちゃんと読み込んでるし何が悪いのかなーって調べたら行き着いた。

stackoverflow.com

だいたいここに書いてあるとおりです。書籍中では [org.clojure/java.jdbc "0.2.3"] となっているのを "0.3.6" と書き換えると with-connection などが使えなくなります。
まぁ一応ネームスペースとして 0.3.0 以前は使えたものは deprecated として残っているのでどうしても使いたければそっちを使ってもいいと思う。

ちなみに 0.3.0 以降だとこう書くぽい。

(ns guestbook.models.db
  (:require [clojure.java.jdbc :as sql])
  (:import java.sql.DriverManager))

(def db {:classname "org.sqlite.JDBC",
         :subprotocol "sqlite",
         :subname "db.sq3"})

(defn create-guestbook-table []
  (sql/db-do-commands db
                      (sql/create-table-ddl
                       :guestbook
                       [:id "integer primary key autoincrement"]
                       [:timestamp "timestamp default current_timestamp"]
                       [:name "text"]
                       [:message "text"]))
  (sql/db-do-commands db "create index timestamp_index on guestbook (timestamp)"))

(defn read-guests []
  (sql/query db ["select * from guestbook order by timestamp desc"]))

(defn save-message [name message]
  (sql/insert! db :guestbook {:name name :message message :timestamp (java.util.Date.)}))

まぁ普通は jdbc を直接使わないんじゃないかなって思いますが…。