【问题标题】:Force hugsql query functions to throw an error when they return the wrong number of results强制 hugsql 查询函数在返回错误数量的结果时抛出错误
【发布时间】:2016-09-26 17:17:45
【问题描述】:

使用 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 的查询函数抛出异常?

【问题讨论】:

  • 这只是一个 hugsql 问题——:result one 无法按您希望的方式工作。如果您认为这是一个错误,请在 github 上提交报告,也许开发人员会制作您想要的内容,或者创建您自己的包装器来计算行数并按照您指定的方式操作。

标签: sql jdbc clojure hugsql


【解决方案1】:

-- :result :one 只取查询返回结果集的第一行,因此无法验证您的查询是否正好返回 1 条记录(哈希图)。

但是,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)

【讨论】:

  • 谢谢柯蒂斯,这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 2013-01-11
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
相关资源
最近更新 更多