Search code examples
jdbcclojurecompojurecheshire

check resultset for emptiness in clojure jdbc


i'm using clojure with jdbc, compojure, cheshire, postgresql, c3p0, tryin make REST. When i'm using this code as handler

  (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)
                                     ))}))

If reslutset is not empty i have response as i need, but if its empty i got empty brackets [].

Also this is my project dependencies

  :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"]]

Solution

  • The :row-fn function is executed for each row in the result set. When your result set is empty, row-fn is not called.

    You may need to use the result of sql/query to handle the response of the query. When there is no result an empty vector is returned (this is []). You can check if the result is empty by calling empty?. Something like this:

    (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)))))