YeSQL:哪个键需要值?

时间:2018-08-16 11:47:43

标签: clojure

我正在遵循基本的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

1 个答案:

答案 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.jdbcyesql版本很容易出现不匹配的情况。例如,在下面的部门中将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