昨日は環境変数を扱いました。
今日はよりDBからのデータ取得周りを改善してみます
HoneySQL
というSQLクエリをClojureのデータ構造(マップやベクター)として構築できるライブラリを使ってみます
HoneySQL
まずはプロジェクトにライブラリを追加します
project.clj
:dependencies [[org.clojure/clojure "1.10.3"]
...
[com.github.seancorfield/next.jdbc "1.3.981"]
[com.github.seancorfield/honeysql "2.6.1243"] ; 追加]
次にREPLで実際に使ってみます
REPL
(require '[honey.sql :as sql])
; nil
(def select-all (sql/format {:select [:*] :from [:feed]}))
; #'clojure-rss-reader.handler.feeds/select-all
select-all
; ["SELECT * FROM feed"]
このようにSQLを直接書かずに、マップで表現することができました。
これをハンドラーに組み込んで実装してみます
handler/feeds.clj
(ns clojure-rss-reader.handler.feeds
(:require [ataraxy.response :as response]
[integrant.core :as ig]
[next.jdbc :as jdbc]
[next.jdbc.result-set :as rs]
[honey.sql :as sql]))
(def select-all (sql/format {:select [:*] :from [:feed]}))
(defn get-feeds [db]
(let [result (jdbc/execute! db select-all {:builder-fn rs/as-unqualified-lower-maps})]
{:feeds result}))
(defmethod ig/init-key ::get [_ {{:keys [spec]} :db}]
(fn [_]
[::response/ok (get-feeds spec)]))
今まで jdbc/execute! db ["SELECT * FROM feed"] {:builder-fn ...}
のように直接SQLを書いていたところを置き換えることができました
HoneySQLを活用することで可読性や保守性高く実装することができそうです