使用clojure.jdbc和clojure / data.json扩展对jsonb的支持
这是我第一次进入Clojure(完全是函数式编程),我试图使用clojure.jdbc库来扩展对JSONB的支持。 我一直在用这个作为指导:
http://niwibe.github.io/clojure.jdbc/#_extend_sql_types
还使用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并尝试运行我的加载文件命令时
(load-file "src/db/jdbc-types-jsonb.clj")
编译器抱怨这个错误:
CompilerException java.lang.RuntimeException:在此上下文中无法解析符号:as-sql-type,编译:(/ Users / akmiller / Source / personal / clojure -pg / src / db / jdbc-types-jsonb.clj:14 :26)
我试图理解为什么它没有看到as-sql-type作为'this'在那一点应该是协议正确的? 对不起,如果这是一个noob类型的问题(我敢肯定它),但我只是没有看到这个问题,我需要一些Clojure的专业知识来帮助我渡过这个非常小的障碍!
我可以通过改变这一行来解决这个问题:
(let [prepared-value (as-sql-type this conn)]
对此:
(let [prepared-value (jdbc.proto/as-sql-type this conn)]
我仍然不确定为什么,在这种情况下,我需要完全限定函数名称,因为这应该引用我正在扩展的类型(或者我认为)。 如果有人有更多关于为什么需要获得资格的说明,我很乐意听到。
链接地址: http://www.djcxy.com/p/82573.html上一篇: Extending support for jsonb with clojure.jdbc and clojure/data.json