Korma é uma das bibliotecas Clojure SQL mais populares.
Quando comecei a refatorar partes repetidas de meus modelos de dados no próprio namespace models.helpers
, encontrei uma fraqueza de seu DSL – [korma.core/fields](https://github.com/korma/Korma/blob/v0.3.2/src/korma/core.clj#L202)
usa argumentos variados para o nome do campo, o que torna impossível usá-lo em funções de alto nível ou compor com macros de threading ( ->, – >> ).
Portanto, escrevi uma pequena macro, que contém uma lista de nomes de campos e aliases em korma.core/fields
argumentos variados.
;; helper macro
(defmacro only-fields
[query fields]
`(let [field-list# (list* ~fields)
fargs# (cons ~query field-list#)]
(apply korma.core/fields fargs#)))
;; helper function
(defn get-rows
;; this function returns all fields
([tbl-entity row-selectors]
(korma/select tbl-entity
(korma/where row-selectors)))
;; this one accepts field selector as 3rd argument
([tbl-entity row-selectors fields]
(korma/select tbl-entity
(only-fields fields)
(korma/where row-selectors))))
;;usage
(defentity users)
(get-rows users [:firstname :lastname :gender [:lang :language]])
(get-rows users ["*"])
PS: eu recomendo usar Yesql como biblioteca Clojure SQL, porque Korma parece estar se aposentando e o próprio SQL já é DSL, S-EXPR apenas adiciona ruído extra.