2017-10-12 8 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) 
            ))})) 

iは応答を持っていますが、その空の場合、私は、空の括弧[]を得ました。

も、これは私のプロジェクトの依存関係

: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をラップする必要があります接続エラーまたはdbエラーの場合は、try/catchを呼び出します。最初のレコードに興味があるときは、最初の(SQL/query ....)(Excepton e(log .getMesage e)のログを記録)を実行して、レコードを取得するか、 –

関連する問題