检查clojure jdbc中的结果集是否为空

检查clojure jdbc中的结果集是否为空,jdbc,clojure,compojure,cheshire,Jdbc,Clojure,Compojure,Cheshire,我将clojure与jdbc、compojure、cheshire、postgresql、c3p0一起使用,并尝试创建REST。当我将此代码用作处理程序时 (defn get-document [id] (sql/query (db-connection) ["select * from document where id = cast(? as integer)" id] {:row-fn

我将clojure与jdbc、compojure、cheshire、postgresql、c3p0一起使用,并尝试创建REST。当我将此代码用作处理程序时

  (defn get-document [id]
      (sql/query (db-connection)
                 ["select * from document where id = cast(? as integer)" id]
                 {:row-fn
                  (fn [first]
                                   (if (empty? first )
                                     (response "empty")
                                     (response first)
                                     ))}))
如果reslutset不是空的,我会得到我需要的响应,但如果它是空的,我会得到空括号[]

这也是我的项目依赖项

  :dependencies [[org.clojure/clojure "1.8.0"]
                 [compojure "1.5.1"]
                 [ring/ring-json "0.4.0"]
                 [c3p0/c3p0 "0.9.1.2"]
                 [ring/ring-defaults "0.2.1"]
                 [org.clojure/java.jdbc "0.7.3"]
                 [org.postgresql/postgresql "42.1.4"]
                 [cheshire "5.8.0"]]

对结果集中的每一行执行
:row fn
功能。当结果集为空时,不调用第fn行

您可能需要使用
sql/query
的结果来处理查询的响应。当没有结果时,返回一个空向量(这是
[]
)。您可以通过调用
empty?
检查结果是否为空。大概是这样的:

(defn get-document [id]
  (let [query ["select * from document where id = cast(? as integer)" id]
        rows  (sql/query (db-connection) query)]
      (if (empty? rows)
        (response "empty")
        (response (first rows)))))

[]
是一个空向量。你期望得到什么(大概是
nil
)?为什么返回
[]
是一个问题?如果向量为空,我会尝试做出自定义响应,我知道谓词(空?)必须与它一起工作,但它不是,我不明白我做错了什么,我想我现在明白了。您希望看到响应“empty”,但没有得到它。另一点需要注意的是,如果执行(first rs),其中rs是结果集,rs为空,first将返回nil,因此(如果(nil)(first rs)),您应该在连接或db错误的情况下,将sql调用包装为try/catch。当您只对第一条记录感兴趣时,可以执行(first(sql/query…)(catch Excepton e(log.getMesage e)nil)操作,这样您就可以得到一条记录或得到nil