Clojure 将数据插入数据库

问题描述 投票:0回答:3

我开始学习 clojure,我有一个问题。 我只有 2 个文件,project.clj

(defproject test-clojure-project "0.1.0-SNAPSHOT"
  :description "A simple Clojure web project"
  :dependencies [[org.clojure/clojure "1.10.0"]
                 [ring "1.10.0"]
                 [ring/ring-jetty-adapter "1.10.0"]
                 [ring/ring-json "0.5.0"]
                 [cheshire "5.10.0"]
                 [org.postgresql/postgresql "42.3.1"]
                 [org.clojure/java.jdbc "0.7.11"]
                ;;  [ring/ring-reload "0.3.1"]
                 ]
  :main ^:skip-aot test-clojure-project.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})

和 src/test-clojure-project/core.clj`

(ns test-clojure-project.core
  (:require [ring.adapter.jetty :as jetty]
            [ring.util.response :as response]
            [ring.middleware.reload :refer [wrap-reload]]
            [cheshire.core :as json]
            [clojure.java.jdbc :as jdbc]
            [clojure.java.jdbc.ddl :as ddl]))

(def db-spec
  {:subprotocol "postgresql"
   :subname "//localhost/test_db"
   :user "postgres"
   :password "secret"})

(def posts-table
  [:posts
   [:id :serial "PRIMARY KEY"]
   [:content :text]])

(defn create-post [post]
  (jdbc/with-connection db-spec
    (jdbc/insert! :posts
                  {:content (:content post)})))

(defn get-data []
  (jdbc/with-connection db-spec
    (jdbc/query "SELECT * FROM posts")))

(defn handler [request]
  (let [uri (:uri request)]
    (cond
      (= uri "/posts-list")
      (let [response-data (get-data)]
        (response/response (str response-data)))

      (= uri "/create-post")
      (if (= (:request-method request) :post)
        (let [json-data (-> request :body slurp)
              parsed-data (json/parse-string json-data true)
              created-post (create-post parsed-data)]
          (response/response (json/generate-string created-post)))
        (response/response "Invalid request method"))

      :else
      (response/response "Route not found"))))

(defn -main []
  (do
    (println "Server started successfully on port 3000")
    ;; Create the 'posts' table if it doesn't exist
    (jdbc/with-connection db-spec
      (ddl/create-table-ddl posts-table :if-not-exists))
    (jetty/run-jetty (wrap-reload handler) {:port 3000})))

收到此错误

2023-08-05 17:41:30.332:INFO :: main:日志记录初始化@1359ms到org.eclipse.jetty.util.log.StdErrLog 线程“main”中出现异常编译时出现语法错误(test_clojure_project/core.clj:1:1)。 导致:java.io.FileNotFoundException:无法在类路径上找到 clojure/java/jdbc/ddl__init.class、clojure/java/jdbc/ddl.clj 或 clojure/java/jdbc/ddl.cljc。

我该如何解决它,有人可以帮忙吗?

database postgresql clojure lisp
3个回答
1
投票

我看到两个影响 ns 加载的问题:

  1. Clojure 使用 munge 从标识符中删除特殊字符,例如在查找相应资源之前的命名空间名称。例如,
    -
    替换为
    _

因此,您的源文件应该位于名为

test_clojure_project
的文件夹中。

  1. org.clojure/java.jdbc 中没有定义
    clojure.java.jdbc.ddl
    命名空间。删除
    require
    形式并仅使用
    jdbc/create-table-ddl

0
投票

这里存在很多问题。正如 Erdos 指出的那样,

clojure.java.jdbc.ddl
不存在——
create-table-ddl
clojure.java.jdbc
的一部分。而且,是的,您的文件应该是
src/test_clojure_project/core.clj
,其
ns
值为
test-clojure-project.core

您应该删除

[clojure.java.jdbc.ddl :as ddl]
(但您仍然需要
[clojure.java.jdbc :as jdbc]
,因为您正在使用其中的函数)。

此外,您的代码看起来需要更旧版本的

org.clojure/java.jdbc
——在版本0.7.11中没有
with-connection
,并且像
insert!
这样的函数必须传递一个db-spec作为它们的第一个参数.

参见 https://cljdoc.org/d/org.clojure/java.jdbc/0.7.11/api/clojure.java.jdbc#insert!对于 0.7.11 文档(请注意,它不是最新版本)。

无论您学习什么教程或书籍都已经过时了。您是否尝试使用教程/书籍所说使用的

project.clj
中的依赖项的确切版本?


0
投票

我有一个使用 H2 和 Postgres 数据库的演示项目。

https://github.com/io-tupelo-demo/demo-jdbc-next

只需克隆项目并运行如下:

~/io-tupelo-demo/demo-jdbc-next > ./pg-start.bash 
977fedce73349c6717033cf1025be4bf8a3d2e6893908579726902f126537e5c
~/io-tupelo-demo/demo-jdbc-next > lct
 => time (lein do clean, test)
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.

lein test _bootstrap

-----------------------------------
   Clojure 1.11.1    Java 20.0.1
-----------------------------------

lein test tst.demo.jdbc-h2

lein test tst.demo.jdbc-postgres

Ran 7 tests containing 42 assertions.
0 failures, 0 errors.
  35.53s user 0.86s system 326% cpu 11.156 total
~/io-tupelo-demo/demo-jdbc-next > 
~/io-tupelo-demo/demo-jdbc-next > 
~/io-tupelo-demo/demo-jdbc-next > ./pg-stop.bash 
pg-docker
© www.soinside.com 2019 - 2024. All rights reserved.