繁体   English   中英

强制hugsql查询函数在返回错误数量的结果时引发错误

[英]Force hugsql query functions to throw an error when they return the wrong number of results

使用Clojure和hugsql。 我这样定义我的查询。

-- :name query-should-return-one-but-returns-multiple
-- :result one
-- :command :query
SELECT v.id FROM some_table v;

在使用def-db-fns ,这将在我的命名空间中创建一个query-should-return-one-but-returns-multiple的函数。

但是,如果some_table有多行,则此函数将仅返回任意行,并且不会发出错误信号。

如果数据库返回多个结果,如何强制定义的查询函数返回:one引发异常?

-- :result :one只是获取查询返回结果集的第一行,因此无法验证查询是否恰好返回了-- :result :one记录(哈希映射)。

但是,HugSQL使用Clojure多方法来定义其结果类型,因此您可以创建自己的方法或覆盖现有方法以满足需要。

我们定义一个函数result-exactly-one ,当结果的计数不为1时将抛出异常。 然后,使用:exactly-one关键字定义hugsql-result-fn多方法。 请注意,带引号的命名空间符号(在本例中为user )指的是我们创建的函数。

(require '[hugsql.core :as hugsql]
         '[hugsql.adapter])

(defn result-exactly-one
  [this result options]
  (let [rs (hugsql.adapter/result-many this result options)]
    (if (= 1 (count rs)) 
        rs 
        (throw (ex-info "Oops!" {})))))

(defmethod hugsql/hugsql-result-fn :exactly-one [sym] 'user/result-exactly-one)
-- :name return-exactly-one
-- :result :exactly-one
-- :command :query
SELECT v.id FROM t1 v;

并返回0个或多个记录的结果:

user=> (return-exactly-one db)

ExceptionInfo Oops!  clojure.core/ex-info (core.clj:4617)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM