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 21

Clojure: DuctでRSSリーダーを作る - DB接続(HikariCP, Jdbc)

Last updated at Posted at 2024-12-21

advent_calendar_2024.png

Advent Calendar 2024 Day 21

昨日はDuctでルーティングを実装しました

今日はDB接続したいと思います。

今回の記事ではpostgresqlに接続しますが、
DBの立ち上げ部分に関しては省略します

データベース接続を作るのに、HikariCPというものを使おうと思います

DB接続プール

HikariCPは高速かつ効率的なデータベース接続プールライブラリです。

さっそくproject.cljに追加します

project.clj
  :dependencies [[org.clojure/clojure "1.10.3"]
                 [duct/core "0.8.0"]
                 [metosin/ring-http-response "0.9.4"]
                 [duct/module.ataraxy "0.3.0"]
                 [duct/module.logging "0.5.0"]
                 [duct/module.web "0.7.4"]
                 [duct/database.sql.hikaricp "0.4.0"] ; 追加
                 [org.postgresql/postgresql "42.7.4"] ; 追加
                 [com.github.seancorfield/next.jdbc "1.3.981"] ; 追加]

ついでにpostgresqlドライバーと、jdbcというデータベースアクセスライブラリを入れました

次にconfig.ednに設定を追加していきます

config.edn
  :duct.database.sql/hikaricp
  {:adapter "postgresql"
   :server-name "localhost"
   :port-number "5432"
   :username "user"
   :password "password"
   :database-name "feed"}

  :clojure-rss-reader.handler.feeds/get
  {:db #ig/ref :duct.database.sql/hikaricp}

ここでは、DB接続情報を:duct.database.sql/hikaricpに設定しています。

そしてその設定情報をhandlerに渡しています。

#ig/refはIntegrantの依存関係の参照を表していて、:dbに渡しています

データ取得

次に、ハンドラー側の実装をいじっていきます

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]))

(defn get-feeds [db]
  (let [result (jdbc/execute! db ["SELECT * FROM feed"] {:builder-fn rs/as-unqualified-lower-maps})]
    {:feeds result}))

(defmethod ig/init-key ::get [_ {{:keys [spec]} :db}]
  (fn [_]
    [::response/ok (get-feeds spec)]))

こんな感じで実装しました

dbを受け取りデータベースの値を返すget-feedsという関数を作り、それをhandlerで呼び出しています

実際にリクエストを送ってみましょう

まずサーバーを起動します

$ lein repl
user=> (dev)
:loaded
dev=> (go)
:duct.server.http.jetty/starting-server {:port 3000}
:initiated

そしてリクエストを送ってみます

解説はしていませんが、postgresqlをローカルに立てています。

$ curl localhost:3000/v1/feeds | jq .

{
  "feeds": [
    {
      "id": 1,
      "url": "https://www.google.com",
      "title": "Google",
      "description": "Googleのトップページです。",
      "created_at": "2024-12-19T05:24:36Z"
    },
    {
      "id": 2,
      "url": "https://www.yahoo.co.jp",
      "title": "Yahoo! JAPAN",
      "description": "Yahoo! JAPANのトップページです。",
      "created_at": "2024-12-19T05:24:36Z"
    }
  ]
}

いい感じでDBに入っているデータを取得することができました。

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?