Проверить набор результатов на пустоту в clojure jdbc

Я использую clojure с jdbc, compojure, cheshire, postgresql, c3p0, пытаюсь сделать 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"]]

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)))))
Другие вопросы по тегам