0

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データベースが複数の結果を返した場合、例外をスローするように定義されたクエリ関数を強制するにはどうすればよいですか?

4

1 に答える 1

1

-- :result :oneクエリの返された結果セットの最初の行を取得するだけなので、クエリが正確に 1 つのレコード (ハッシュマップ) を返すことは確認されません。

ただし、HugSQL は Clojure マルチメソッドを使用して結果の型を定義するため、ニーズに合わせて独自のメソッドを作成したり、既存のメソッドをオーバーライドしたりできます。

result-exactly-one結果のカウントが 1 でない場合に例外をスローする関数を定義します。次に、キーワードでhugsql-result-fnmultimethod を定義します。: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)
于 2016-09-26T21:20:33.953 に答える