【问题标题】:check resultset for emptiness in clojure jdbc在 clojure jdbc 中检查结果集是否为空
【发布时间】:2018-03-24 04:11:32
【问题描述】:

我正在将 clojure 与 jdbc、compojure、cheshire、postgresql、c3p0、tryin make 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"]]

【问题讨论】:

  • [] 是一个空向量。你期望得到什么(大概是nil)?为什么[] 被退回是个问题?
  • 如果向量为空,我会尝试做出自定义响应,我怎么知道谓词(空?)必须使用它,但不是,我不明白我做错了什么
  • 我想我现在明白了。您希望看到响应“空”,但没有得到它。
  • 另外一点需要注意的是,如果你做一个 (first rs),其中 rs 是你的结果集并且 rs 是空的,first 将返回 nil,所以 (if (nil? (first rs)) )

标签: jdbc clojure compojure cheshire


【解决方案1】:

:row-fn 函数针对结果集中的每一行执行。当您的结果集为空时,不会调用 row-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)))))

【讨论】:

  • 您应该将 sql 调用包装在 try/catch 中,以防出现连接或数据库错误。当您只对第一条记录感兴趣时,您可以执行 (first (sql/query....) (catch Exceptionon e (log .getMesage e) nil) 以便您获得记录或获得 nil
猜你喜欢
  • 2013-05-09
  • 2014-04-13
  • 2018-12-13
  • 2011-08-25
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
相关资源
最近更新 更多