2009-09-26 51 views
4
(ns db-example 
    (:use [clojure.contrib.sql :only (with-connection with-query-results)]) 
    (:import (java.sql DriverManager))) 

;; need this to load the sqlite3 driver (as a side effect of evaluating the expression) 
(Class/forName "org.sqlite.JDBC") 

(def +db-path+ "...") 
(def +db-specs+ {:classname "org.sqlite.JDBC", 
       :subprotocol "sqlite", 
       :subname  +db-path+}) 

(def +transactions-query+ "select * from my_table") 

(with-connection +db-specs+ 
    (with-query-results results [+transactions-query+] 
    ;; results is an array of column_name -> value maps 
    )) 
+6

代码有问题吗? – 2009-09-26 01:32:55

回答

11

您必须实际返回with-query-results宏中的内容。而且由于势必results的序列是懒惰的,让我们使用它:

(with-connection +db-specs+ 
    (with-query-results results [+transactions-query+] 
    (doall results))) 

使用clojure.contrib.sql,不依赖于SQLite的JDBC适配器时,这是一个常见的模式。

顺便说一句我从来没有必要手动做(Class/forName driver-class-str),这显然是你的Java习惯。驱动程序在contrib.sql的引擎下加载。