我正在遵循基本的YeSQL教程,并从here复制了代码,但出现错误:
Exception in thread "main" java.lang.IllegalArgumentException: No value supplied for key: {:identifiers #object[clojure.string$lower_case 0x7c31e410 "clojure.string$lower_case@7c31e410"], :row-fn #object[clojure.core$identity 0x6febec41 "clojure.core$identity@6febec41"], :result-set-fn #object[clojure.core$doall 0x4e8afdad "clojure.core$doall@4e8afdad"]}
at clojure.lang.PersistentHashMap.create(PersistentHashMap.java:77)
at clojure.java.jdbc$query.invokeStatic(jdbc.clj:756)
at clojure.java.jdbc$query.doInvoke(jdbc.clj:756)
at clojure.lang.RestFn.invoke(RestFn.java:442)
at yesql.generate$query_handler.invokeStatic(generate.clj:89)
at yesql.generate$query_handler.invoke(generate.clj:82)
at yesql.generate$generate_query_fn$real_fn__1710.invoke(generate.clj:120)
at yesql.generate$generate_query_fn$query_wrapper_fn__1715.invoke(generate.clj:139)
at yesql.generate$generate_query_fn$query_wrapper_fn__1715.invoke(generate.clj:138)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.lang.AFunction$1.doInvoke(AFunction.java:29)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at aplikacija.core$_main.invokeStatic(core.clj:15)
at aplikacija.core$_main.doInvoke(core.clj:14)
at clojure.lang.RestFn.invoke(RestFn.java:397)
at clojure.lang.Var.invoke(Var.java:375)
at clojure.lang.AFn.applyToHelper(AFn.java:152)
at clojure.lang.Var.applyTo(Var.java:700)
at clojure.core$apply.invokeStatic(core.clj:646)
at clojure.main$main_opt.invokeStatic(main.clj:314)
at clojure.main$main_opt.invoke(main.clj:310)
at clojure.main$main.invokeStatic(main.clj:421)
at clojure.main$main.doInvoke(main.clj:384)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.lang.Var.invoke(Var.java:383)
at clojure.lang.AFn.applyToHelper(AFn.java:156)
at clojure.lang.Var.applyTo(Var.java:700)
at clojure.main.main(main.java:37)
我一直在寻找解决方案,并提出了this,但是我看不到哪个键需要值。有什么更好的方法可以调试或从此消息中清楚问题出在哪里?我正在尝试在数据库中进行简单选择。这是我的代码:
(ns aplikacija.core (require [yesql.core :refer [defqueries]]))
(def db-spec {:classname "oracle.jdbc.OracleDriver"
:subprotocol "oracle:thin"
:subname "address:port/db"
:user "xxx"
:password "xxx"})
(defqueries "sql/query.sql"
{:connection db-spec})
(defn -main [& args]
(println (posAll {:id 10})))
查询是
-- name: posAll
SELECT *
FROM pos
WHERE POS_ID = :id
答案 0 :(得分:1)
当IllegalArgumentException
试图在内部使用实际JDBC选项作为映射来构建映射时,会抛出clojure.java.jdbc
。它应该能够按原样使用选项映射,因此肯定存在一些问题。
抛出异常的简单示例:
(PersistentHashMap/create '({:A 42}))
IllegalArgumentException No value supplied for key: {:A 42} ...
(PersistentHashMap/create '({:A 42} "foo"))
=> {{:A 42} "foo"}
我尝试按给定的方式运行您的示例,尽管用Postgresql替换了数据库,但效果很好。但是,我注意到clojure.java.jdbc
和yesql
版本很容易出现不匹配的情况。例如,在下面的部门中将yesql
替换为0.5.2
会导致构建时间失败。
尽管如此,采用最新版本似乎确实对我有用。这些是在撰写本文时:
:dependencies [[org.clojure/clojure "1.8.0"]
[yesql "0.5.3"]
[org.clojure/java.jdbc "0.7.8"]
[org.postgresql/postgresql "42.2.4"]]
还请注意,1)yesql
目前未积极维护(Frozen. Maintainer sought.),2)Oracle未列为supported DB for org.clojure/java.jdbc
。