-- :result :one
クエリの返された結果セットの最初の行を取得するだけなので、クエリが正確に 1 つのレコード (ハッシュマップ) を返すことは確認されません。
ただし、HugSQL は Clojure マルチメソッドを使用して結果の型を定義するため、ニーズに合わせて独自のメソッドを作成したり、既存のメソッドをオーバーライドしたりできます。
result-exactly-one
結果のカウントが 1 でない場合に例外をスローする関数を定義します。次に、キーワードでhugsql-result-fn
multimethod を定義します。:exactly-one
引用符で囲まれた名前空間 (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)