我开始学习 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。
我该如何解决它,有人可以帮忙吗?
我看到两个影响 ns 加载的问题:
-
替换为 _
。因此,您的源文件应该位于名为
test_clojure_project
的文件夹中。
clojure.java.jdbc.ddl
命名空间。删除 require
形式并仅使用 jdbc/create-table-ddl
。这里存在很多问题。正如 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
中的依赖项的确切版本?
我有一个使用 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