Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用clojure.jdbc和clojure/data.json扩展对jsonb的支持_Jdbc_Clojure - Fatal编程技术网

使用clojure.jdbc和clojure/data.json扩展对jsonb的支持

使用clojure.jdbc和clojure/data.json扩展对jsonb的支持,jdbc,clojure,Jdbc,Clojure,这是我第一次涉足Clojure(以及函数式编程),我试图使用Clojure.jdbc库扩展对JSONB的支持。我一直以此为指导: 还使用leinengen,因此我的依赖项设置如下: [org.clojure/clojure "1.6.0"] [clj-http "0.9.1"] [clojure.jdbc "0.3.1"] [postgresql "9.3-1102.jdbc41"] [org.clojure/data.json "0.2.5"] 然后我的代码如下所示: (require '

这是我第一次涉足Clojure(以及函数式编程),我试图使用Clojure.jdbc库扩展对JSONB的支持。我一直以此为指导:

还使用leinengen,因此我的依赖项设置如下:

[org.clojure/clojure "1.6.0"]
[clj-http "0.9.1"]
[clojure.jdbc "0.3.1"]
[postgresql "9.3-1102.jdbc41"]
[org.clojure/data.json "0.2.5"]
然后我的代码如下所示:

(require '[jdbc.proto])
(require '[clojure.data.json :as json])
(import 'org.postgresql.util.PGobject)

(extend-protocol jdbc.proto/ISQLType 
  clojure.lang.IPersistentMap

  (set-stmt-parameter! [this conn stmt index]
    (let [prepared-value (as-sql-type this conn)]
      (.setObject stmt index prepared-value)))

  (as-sql-type [this conn]
    (doto (PGobject.)
      (.setType "jsonb")
      (.setValue (json/write-str)))))
当我运行REPL并尝试运行loadfile命令时

(load-file "src/db/jdbc-types-jsonb.clj")
编译器抱怨此错误:

CompilerException java.lang.RuntimeException:无法将符号解析为此上下文中的sql类型,编译:(/Users/akmiller/Source/personal/clojure pg/src/db/jdbc types jsonb.clj:14:26)


我试图理解为什么它不将sql类型视为“this”,那么协议是否正确?很抱歉,如果这是一个noob类型的问题(我肯定是),但我只是没有看到这个问题,我需要一些Clojure的专业知识来帮助我克服这个非常小的障碍

我可以通过更改以下行来解决此问题:

(let [prepared-value (as-sql-type this conn)]
为此:

(let [prepared-value (jdbc.proto/as-sql-type this conn)]

我仍然不知道为什么,在这种情况下,我需要完全限定函数名,因为它应该引用我正在扩展的类型(或者我认为是这样)。如果有人对为什么需要在那里获得资格有更多的澄清,我很高兴听到。

扩展sql类型文档的链接断开了。可能的替代方案是:我不确定这是否回答了你的问题,因为这可能是显而易见的<代码>作为sql类型需要限定,因为它是
jdbc.proto
命名空间中的一个变量。