2017-10-12 17 views
0

jdbc, compojure, cheshire, postgresql, c3p0, tryin make REST와 함께 clojure를 사용하고 있습니다. 내가 핸들러로이 코드를 사용하고 때 reslutset이 비어 있지 않으면 내가 필요로하는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) 
            ))})) 

는 내가 반응이 있지만 비어있는 경우 난 빈 대괄호 []를 얻었다.

또한이 내 프로젝트 의존성

: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

'[]'은 (는) 빈 벡터입니다. 당신은 무엇을 얻을 것으로 예상 했습니까 (아마도 '없음')? '[] '가 왜 문제가 되나요? –

+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

은 연결 또는 db 오류의 경우 try/catch를 호출하십시오. 첫 번째 레코드에만 관심이있을 때 레코드를 얻거나 nil을 얻도록 (첫 번째 (SQL/쿼리 ....) (Excepton e (log .getMesage e) 로그를 잡음) 할 수 있습니다. –