70 lines
2.5 KiB
Clojure
70 lines
2.5 KiB
Clojure
;; copyright (c) 2020-2024 Sean Corfield, all rights reserved
|
|
|
|
(ns next.jdbc.plan
|
|
"Some helper functions that make common operations with `next.jdbc/plan`
|
|
much easier."
|
|
(:require [next.jdbc :as jdbc]))
|
|
|
|
(set! *warn-on-reflection* true)
|
|
|
|
(defn select-one!
|
|
"Execute the SQL and params using `next.jdbc/plan` and return just the
|
|
selected columns from just the first row.
|
|
|
|
`(plan/select-one! ds [:total] [\"select count(*) as total from table\"])`
|
|
;;=> {:total 42}
|
|
|
|
If the `cols` argument is a vector of columns to select, then it is
|
|
applied using `select-keys`, otherwise, the `cols` argument is used as
|
|
a function directly. That means it can be a simple keyword to return
|
|
just that column -- which is the most common expected usage:
|
|
|
|
`(plan/select-one! ds :total [\"select count(*) as total from table\"])`
|
|
;;=> 42
|
|
|
|
The usual caveats apply about operations on a raw result set that
|
|
can be done without realizing the whole row."
|
|
([connectable cols sql-params]
|
|
(select-one! connectable cols sql-params {}))
|
|
([connectable cols sql-params opts]
|
|
(reduce (fn [_ row] (reduced (if (vector? cols)
|
|
(select-keys row cols)
|
|
(cols row))))
|
|
nil
|
|
(jdbc/plan connectable sql-params opts))))
|
|
|
|
(defn select!
|
|
"Execute the SQL and params using `next.jdbc/plan` and (by default)
|
|
return a vector of rows with just the selected columns.
|
|
|
|
`(plan/select! ds [:id :name] [\"select * from table\"])`
|
|
|
|
If the `cols` argument is a vector of columns to select, then it is
|
|
applied as:
|
|
|
|
`(into [] (map #(select-keys % cols)) (jdbc/plan ...))`
|
|
|
|
Otherwise, the `cols` argument is used as a function and mapped over
|
|
the raw result set as:
|
|
|
|
`(into [] (map cols) (jdbc/plan ...))`
|
|
|
|
The usual caveats apply about operations on a raw result set that
|
|
can be done without realizing the whole row.
|
|
|
|
Note: this allows for the following usage, which returns a vector
|
|
of all the values for a single column:
|
|
|
|
`(plan/select! ds :id [\"select * from table\"])`
|
|
|
|
The result is a vector by default, but can be changed using the
|
|
`:into` option to provide the initial data structure into which
|
|
the selected columns are poured, e.g., `:into #{}`"
|
|
([connectable cols sql-params]
|
|
(select! connectable cols sql-params {}))
|
|
([connectable cols sql-params opts]
|
|
(into (or (:into opts) [])
|
|
(map (if (vector? cols)
|
|
#(select-keys % cols)
|
|
cols))
|
|
(jdbc/plan connectable sql-params opts))))
|