2017-10-12 108 views
0

我使用clojure jdbc,compojure,cheshire,postgresql,c3p0,tryin使REST。當我使用此代碼爲處理檢查結果集的空虛clojure jdbc

(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"]] 
+0

'[]'是一個空向量。你期望得到什麼(可能是'nil')?爲什麼'[]'返回一個問題? –

+0

我tryna做自定義的響應,如果向量是空的,我如何知道謂詞(空?)必須使用它,但它不是,我不明白我在做什麼錯 – Bartosso

+0

我想我現在明白了。您期待看到響應「空」,但沒有得到它。 –

回答

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))))) 
+0

你應該包裝sql在連接或數據庫錯誤的情況下調用try/catch。當你只對第一條記錄感興趣的時候,你可以做一個(第一個(sql/query ....)(捕獲Excepton e(log.getMesage e)nil),這樣你可以得到一個記錄或者得到零 –