<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Jdbc on Rindrics Mumbles</title>
    <link>https://rindrics.com/tags/jdbc/</link>
    <description>Jdbc</description>    
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Thu, 16 Jul 2026 00:00:00 +0900</lastBuildDate>
    <atom:link href="https://rindrics.com/tags/jdbc/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Clojureに入門した</title>
      <link>https://rindrics.com/posts/hello-clojure/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0900</pubDate>
      
      <guid>https://rindrics.com/posts/hello-clojure/</guid>
      <description>&lt;p&gt;Clojureを完全理解した。&lt;/p&gt;
&lt;h2 id=&#34;前提&#34;&gt;前提&lt;/h2&gt;
&lt;h3 id=&#34;入門者の状態&#34;&gt;入門者の状態&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;REPL駆動開発の経験あり&lt;/li&gt;
&lt;li&gt;関数型プログラミングの経験あり&lt;/li&gt;
&lt;li&gt;前置記法の経験あり&lt;/li&gt;
&lt;li&gt;Clojureについてはなにもわからない&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;やりたいこと&#34;&gt;やりたいこと&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;最終的には、受け取ったデータをテーブルに投入するサービスを作りたい&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;DOP（データ指向プログラミング）スタイルで実装したいので、DOP本家のClojureで書きたい&lt;/li&gt;
&lt;li&gt;Clojureについて何もわからないので、最低限の要素を学んでおきたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本記事では、下記について学ぶことにした:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データを入れた変数（動作確認時に入力の代わりに使う）&lt;/li&gt;
&lt;li&gt;dbに接続する方法&lt;/li&gt;
&lt;li&gt;入力をテーブルスキーマにマッピングする関数&lt;/li&gt;
&lt;li&gt;関数を使ったデータ投入&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Clojureを使ってサーバーを作る方法もわからないが、それは別の機会にやってみる。&lt;/p&gt;
&lt;h2 id=&#34;clojureを触ってみる&#34;&gt;Clojureを触ってみる&lt;/h2&gt;
&lt;h3 id=&#34;まず完全理解する&#34;&gt;まず完全理解する&lt;/h3&gt;
&lt;p&gt;バイナリを&lt;a href=&#34;https://clojure.org/guides/install_clojure&#34;&gt;インストール&lt;/a&gt;した。
VSCode系エディタに &lt;a href=&#34;https://calva.io/&#34;&gt;Calva&lt;/a&gt; を入れた。&lt;/p&gt;
&lt;p&gt;main.cljを作って適当にコードを書く:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b58900&#34;&gt;+ &lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://calva.io/evaluation/&#34;&gt;Evaluation&lt;/a&gt; によると &lt;code&gt;ctrl + enter&lt;/code&gt; で評価してみると、REPLを立ち上げてくれそうなので &amp;ldquo;Connnect&amp;rdquo; する:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-16-cloju/calva-connect.webp&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;とりあえず &amp;ldquo;Start your project with a REPL and connect&amp;rdquo; を選ぶ:
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-16-cloju/calva-repl.webp&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;エディタ上で評価結果をプレビュー&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;できるようになった:
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-16-cloju/calva-eval.webp&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;関数定義 &amp;amp; 呼び出しも動いた:
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-16-cloju/calva-defn.webp&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&#34;最低限のシンタックスを理解する&#34;&gt;最低限のシンタックスを理解する&lt;/h3&gt;
&lt;p&gt;変数定義は &lt;a href=&#34;https://www.clojure.org/guides/learn/syntax#_def&#34;&gt;&lt;code&gt;def&lt;/code&gt; らしい&lt;/a&gt;ので書いてみる&lt;/p&gt;
&lt;p&gt;マップは &lt;a href=&#34;https://www.clojure.org/guides/learn/hashed_colls#_maps&#34;&gt;&lt;code&gt;{&amp;quot;key1&amp;quot; value1 &amp;quot;key2&amp;quot; value2}&lt;/code&gt;&lt;/a&gt;と書くらしい（不安になるシンタックスだ）。&lt;/p&gt;
&lt;p&gt;ちなみに、この↓状態からどうがんばってもカーソル左の閉じ括弧を削除できなかったが:
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-16-cloju/cannot-delete.webp&#34;&gt;
&lt;/figure&gt;

コマンドパレットから &amp;ldquo;slurp&amp;rdquo; で飲み込めた:
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-16-cloju/slurped.webp&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;データを定義できた
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-16-cloju/data-evaled.webp&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&#34;clojureからdbを操作してみる&#34;&gt;ClojureからDBを操作してみる&lt;/h2&gt;
&lt;h3 id=&#34;dbのセットアップ&#34;&gt;DBのセットアップ&lt;/h3&gt;
&lt;p&gt;DBにはPostgreSQLを使いたい。
コンテナ版のPostgreSQL（18系）を使う準備をする:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# docker-compose.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;db&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;image&lt;/span&gt;: postgres:18-alpine
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;${POSTGRES_PORT:-5432}:5432&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;POSTGRES_USER&lt;/span&gt;: yoshimoto
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;POSTGRES_PASSWORD&lt;/span&gt;: samonji
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;POSTGRES_DB&lt;/span&gt;: yoshimoto_samonji
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - postgres_data:/var/lib/postgresql  &lt;span style=&#34;color:#586e75&#34;&gt;# 18系はマウント位置がここ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - yoshimoto-samonji
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;yoshimoto-samonji&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;driver&lt;/span&gt;: bridge
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;postgres_data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker Composeで起動する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;$&lt;/span&gt; docker&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;compose up
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Attaching to db&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; PostgreSQL Database directory appears to contain a database; Skipping initialization
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2026&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;07&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;16&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;08&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;26&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;50.738&lt;/span&gt; UTC [&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;] LOG:  starting PostgreSQL &lt;span style=&#34;color:#2aa198&#34;&gt;18.4&lt;/span&gt; on aarch64&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;unknown&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;linux&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;musl, compiled by gcc (Alpine &lt;span style=&#34;color:#2aa198&#34;&gt;15.2&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#2aa198&#34;&gt;15.2&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;bit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2026&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;07&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;16&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;08&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;26&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;50.738&lt;/span&gt; UTC [&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;] LOG:  listening on IPv4 address &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;, port &lt;span style=&#34;color:#2aa198&#34;&gt;5432&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2026&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;07&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;16&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;08&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;26&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;50.738&lt;/span&gt; UTC [&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;] LOG:  listening on IPv6 address &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;::&amp;#34;&lt;/span&gt;, port &lt;span style=&#34;color:#2aa198&#34;&gt;5432&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2026&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;07&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;16&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;08&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;26&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;50.747&lt;/span&gt; UTC [&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;] LOG:  listening on Unix socket &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;/var/run/postgresql/.s.PGSQL.5432&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2026&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;07&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;16&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;08&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;26&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;50.757&lt;/span&gt; UTC [&lt;span style=&#34;color:#2aa198&#34;&gt;32&lt;/span&gt;] LOG:  database system was shut down at &lt;span style=&#34;color:#2aa198&#34;&gt;2026&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;07&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;16&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;08&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;22&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;51&lt;/span&gt; UTC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2026&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;07&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;16&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;08&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;26&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;50.765&lt;/span&gt; UTC [&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;] LOG:  database system is ready to accept connections
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;テーブル作成などの初期セットアップをしたいので、PostgreSQLコンテナに入ってデータベースに接続する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ docker-compose exec db bash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;b7127e8132c2:/# 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;b7127e8132c2:/# psql yoshimoto_samonji -U yoshimoto
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;psql (18.4)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type &amp;#34;help&amp;#34; for help.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yoshimoto_samonji=# 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接続できたので、テーブルを適当に作成する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yoshimoto_samonji=# CREATE TABLE IF NOT EXISTS test (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yoshimoto_samonji(#     column_1 VARCHAR(64),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yoshimoto_samonji(#     column_2 VARCHAR(64)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yoshimoto_samonji(# );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CREATE TABLE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yoshimoto_samonji=# \dt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          List of tables
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Schema | Name | Type  |   Owner   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--------+------+-------+-----------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; public | test | table | yoshimoto
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(1 row)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでデータ投入準備が整った。&lt;/p&gt;
&lt;h3 id=&#34;dbに接続可能なclojure環境の準備&#34;&gt;DBに接続可能なClojure環境の準備&lt;/h3&gt;
&lt;p&gt;当初、Postgresが立っているDocker network上にClojureコンテナをデプロイし、ターミナルからREPLに入っていたが、エディタとの連携がないため手打ちやコピペが辛かった。
DBの操作を一通り試すにはそこそこの量のコードを実行する必要がるので、VSCode系エディタからインライン実行ができるように、dev container用のClojure環境をセットアップすることにした。&lt;/p&gt;
&lt;p&gt;下記のように、Postgresコンテナと同じネットワーク上にClojureコンテナを構成する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# docker-compose.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;db&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# ------------8&amp;lt;----------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;repl&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;image&lt;/span&gt;: clojure:tools-deps-trixie-slim
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;working_dir&lt;/span&gt;: /workspace
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &amp;lt;THE_CODE_PATH&amp;gt;:/workspace
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;stdin_open&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;tty&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;db&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#268bd2&#34;&gt;condition&lt;/span&gt;: service_started
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - yoshimoto-samonji  &lt;span style=&#34;color:#586e75&#34;&gt;# dbコンテナと同じネットワーク&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;DB_HOST&lt;/span&gt;: db
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;DB_PORT&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;5432&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;DB_NAME&lt;/span&gt;: yoshimoto_samonji
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;DB_USER&lt;/span&gt;: yoshimoto
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;DB_PASSWORD&lt;/span&gt;: samonji        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;command&lt;/span&gt;: sleep infinity
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、&lt;code&gt;docker-compose.yml&lt;/code&gt; に定義したClojureコンテナを利用するように、dev containerを下記のように定義する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# .devcontainer/devcontainer.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;clojure-container&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;dockerComposeFile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;lt;PATH_TO&amp;gt;/docker-compose.yml&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;repl&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;workspaceFolder&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;/workspace&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;shutdownAction&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;stopCompose&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;customizations&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;vscode&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;extensions&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;betterthantomorrow.calva&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dev container起動時に依存の管理方法を聞かれるので、事前に準備しておく必要がある。
&lt;a href=&#34;https://clojure.org/reference/deps_edn&#34;&gt;&lt;code&gt;deps.edn&lt;/code&gt;&lt;/a&gt; を使うことにして、DBにはJDBCクライアントで接続するので、下記のように書いた:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-edn&#34; data-lang=&#34;edn&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;;; deps.edn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:deps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {&lt;span style=&#34;color:#268bd2&#34;&gt;org.clojure/clojure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&lt;span style=&#34;color:#2aa198&#34;&gt;:mvn/version&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;1.12.5&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;com.github.seancorfield/next.jdbc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&lt;span style=&#34;color:#2aa198&#34;&gt;:mvn/version&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;1.3.1070&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;org.postgresql/postgresql&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&lt;span style=&#34;color:#2aa198&#34;&gt;:mvn/version&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;42.7.7&amp;#34;&lt;/span&gt;}}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上を設定したうえでエディタのworkspaceをdev containerで開けば、Clojureコードの評価時に立ち上がるCalva REPL環境もdev container内で起動するようになった。&lt;/p&gt;
&lt;h3 id=&#34;dbへの接続と操作&#34;&gt;DBへの接続と操作&lt;/h3&gt;
&lt;p&gt;JDBCクライアントをロードする:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt;[&lt;span style=&#34;color:#268bd2&#34;&gt;next.jdbc&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;:as&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;jdbc&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;nil&lt;/span&gt;  &lt;span style=&#34;color:#586e75&#34;&gt;;; &amp;lt;= REPLによる評価結果。以下同&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PostgreSQLを利用するためのdata sourceを定義する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#719e07&#34;&gt;def &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;ds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#268bd2&#34;&gt;jdbc/get-datasource&lt;/span&gt; {&lt;span style=&#34;color:#2aa198&#34;&gt;:dbtype&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;postgresql&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#2aa198&#34;&gt;:host&lt;/span&gt; (&lt;span style=&#34;color:#268bd2&#34;&gt;System/getenv&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;DB_HOST&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#2aa198&#34;&gt;:port&lt;/span&gt; (&lt;span style=&#34;color:#268bd2&#34;&gt;parse-long&lt;/span&gt; (&lt;span style=&#34;color:#268bd2&#34;&gt;System/getenv&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;DB_PORT&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#2aa198&#34;&gt;:dbname&lt;/span&gt; (&lt;span style=&#34;color:#268bd2&#34;&gt;System/getenv&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;DB_NAME&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#2aa198&#34;&gt;:user&lt;/span&gt; (&lt;span style=&#34;color:#268bd2&#34;&gt;System/getenv&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;DB_USER&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#2aa198&#34;&gt;:password&lt;/span&gt; (&lt;span style=&#34;color:#268bd2&#34;&gt;System/getenv&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;DB_PASSWORD&amp;#34;&lt;/span&gt;)}))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;user/ds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上で定義したdata sourceを使って実際に接続できるか確認する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;jdbc/execute!&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;ds&lt;/span&gt; [&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;select current_database(), current_user&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[{&lt;span style=&#34;color:#2aa198&#34;&gt;:current_database&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;yoshimoto_samonji&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:current_user&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;yoshimoto&amp;#34;&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接続できたので、引き続きテーブル一覧を取得する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;jdbc/execute!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;ds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;select table_name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;    from information_schema.tables
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;    where table_schema = &amp;#39;public&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;    order by table_name&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:tables&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:table_name&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑先ほど手作業で作ったテーブル &lt;code&gt;test&lt;/code&gt; をClojureからも確認できた。&lt;/p&gt;
&lt;p&gt;テーブル定義を取得してみる:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;jdbc/execute!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;ds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;select column_name, data_type, is_nullable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;    from information_schema.columns
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;    where table_schema = &amp;#39;public&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;    and table_name = ?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;    order by ordinal_position&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:columns&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_name&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;column_1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:data_type&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;character varying&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:is_nullable&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:columns&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_name&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;column_2&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:data_type&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;character varying&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:is_nullable&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑定義したとおりのスキーマが見えた。&lt;/p&gt;
&lt;p&gt;レコードを確認してみる:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;jdbc/execute!&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;ds&lt;/span&gt; [&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;select *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;                    from public.test&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑ 当然、まだなにもない。&lt;/p&gt;
&lt;p&gt;データを適当に投入してみる:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;jdbc/execute!&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;ds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               [&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;insert into public.test (column_1, column_2)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;                 values (?, ?), (?, ?)&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;foo-bar&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;baz&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;world&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:next.jdbc&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:update-count&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;レコードを再確認する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;jdbc/execute!&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;ds&lt;/span&gt; [&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;select *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;                 from public.test&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;foo-bar&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;baz&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;world&amp;#34;&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑ 登録できていた。&lt;/p&gt;
&lt;p&gt;以上から、SQLを直接実行できることを確認できた。&lt;/p&gt;
&lt;h3 id=&#34;受け取ったデータをdbに投入してみる&#34;&gt;受け取ったデータをDBに投入してみる&lt;/h3&gt;
&lt;p&gt;次に、より実際のユースケースに近づけた検証をしてみた。
受け取った入力をテーブルのスキーマにマッピングしたうえでDBに投入したい。&lt;/p&gt;
&lt;p&gt;まず入力を模したデータを定義する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#719e07&#34;&gt;def &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt; {&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;key1&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;abcd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;key2&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;123&amp;#34;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;user/input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;key1&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;abcd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;key2&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;123&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑ ちゃんと定義できている。&lt;/p&gt;
&lt;p&gt;次に、入力をテーブルスキーマにマッピングする関数を定義:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;defn &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;to-test-row&lt;/span&gt; [&lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt;] {&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; (&lt;span style=&#34;color:#b58900&#34;&gt;get &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;key1&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; (&lt;span style=&#34;color:#b58900&#34;&gt;get &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;key2&amp;#34;&lt;/span&gt;)})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;user/to-test-row&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使ってみる:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;to-test-row&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;abcd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;123&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑ 一応できた。&lt;/p&gt;
&lt;p&gt;ちょっと関数定義がハードコードっぽかったので、予めテーブルスキーマを定義し、それを参照する形に書き換える:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#719e07&#34;&gt;def &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;test-schema&lt;/span&gt; {&lt;span style=&#34;color:#2aa198&#34;&gt;:col-1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:col-2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;user/test-schema&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;defn &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;to-test-row&lt;/span&gt; [&lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt;] {(&lt;span style=&#34;color:#b58900&#34;&gt;get &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;test-schema&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;:col-1&lt;/span&gt;) (&lt;span style=&#34;color:#b58900&#34;&gt;get &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;key1&amp;#34;&lt;/span&gt;), (&lt;span style=&#34;color:#b58900&#34;&gt;get &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;test-schema&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;:col-2&lt;/span&gt;) (&lt;span style=&#34;color:#b58900&#34;&gt;get &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;key2&amp;#34;&lt;/span&gt;)})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;user/to-test-row&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに、関数の構成要素を部分的に評価した場合にも評価結果をプレビューできるので検証サイクルを回しやすい。
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-16-cloju/partial-eval.webp&#34;
    alt=&#34;部分評価した場合にも評価結果が見える&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;部分評価した場合にも評価結果が見える&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;テーブルスキーマを参照する形で定義し直した関数を試す:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;to-test-row&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;abcd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;123&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑ 動いた。&lt;/p&gt;
&lt;p&gt;次は、DBにデータを投入する関数を書きたい。
&lt;a href=&#34;https://github.com/bbatsov/clojure-style-guide/blob/master/README.adoc?plain=1#L996C53-L998&#34;&gt;副作用のある関数には &lt;code&gt;!&lt;/code&gt; をつけるのが慣習&lt;/a&gt;らしい:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt;[&lt;span style=&#34;color:#268bd2&#34;&gt;next.jdbc.sql&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;:as&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sql&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;defn &lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;save-test!&lt;/span&gt; [&lt;span style=&#34;color:#268bd2&#34;&gt;ds&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt;] (&lt;span style=&#34;color:#268bd2&#34;&gt;sql/insert!&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;ds&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt; (&lt;span style=&#34;color:#268bd2&#34;&gt;to-test-row&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;user/save-test!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;input&lt;/code&gt; を保存してみる:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;save-test!&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;ds&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;input&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;abcd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;123&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑保存できた。&lt;/p&gt;
&lt;p&gt;その後もいろいろ叩きまくった結果:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;jdbc/execute!&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;ds&lt;/span&gt; [&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;select *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;                 from public.test&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;foo-bar&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;} &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;baz&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;world&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;abcd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;123&amp;#34;&lt;/span&gt;} &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;foo-bar&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;baz&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;world&amp;#34;&lt;/span&gt;} &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;abcd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;123&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;abcd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;123&amp;#34;&lt;/span&gt;} &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;abcd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;123&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;abcd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;123&amp;#34;&lt;/span&gt;} &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;foo-bar&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;baz&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;world&amp;#34;&lt;/span&gt;} &lt;span style=&#34;color:#719e07&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;:test&lt;/span&gt;{&lt;span style=&#34;color:#2aa198&#34;&gt;:column_1&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;abcd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;:column_2&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;123&amp;#34;&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑保存できている。&lt;/p&gt;
&lt;h2 id=&#34;学んだこと&#34;&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;面倒でも、エディタ連携のREPL環境を作ると後が楽&lt;/li&gt;
&lt;li&gt;書きにくさというより、評価結果が読みにくい。慣れていかねば&lt;/li&gt;
&lt;li&gt;Lisp系のシンタックスなのに、&lt;code&gt;[]&lt;/code&gt; と &lt;code&gt;{}&lt;/code&gt; があるだけでなんかモダンに感じる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次はサーバー部分の書き方について学んでみたい。&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;JVMで動くLisp系言語らしいね、くらいの理解）&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://rindrics.com/posts/stock-assess-api-contract-postmortem/#:~:text=data%20service%20%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E7%8B%AC%E7%AB%8B%E3%81%97%E3%81%9F%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AB%E6%80%9D%E3%82%8F%E3%82%8C%E3%82%8B&#34;&gt;この用途&lt;/a&gt;で使いたいため&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;Emacsと違って、実際にコードに埋め込まれているわけではない（確かにコメントアウトされてないし）&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
  </channel>
</rss>
