0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ひとりカレンダー】ClojureAdvent Calendar 2024

Day 23

Clojure: DuctでRSSリーダーを作る - HoneySQL

Last updated at Posted at 2024-12-22

advent_calendar_2024.png

Advent Calendar 2024 Day 23

昨日は環境変数を扱いました。
今日はより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を活用することで可読性や保守性高く実装することができそうです

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?