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

时间:2014-11-08 18:34:34

标签: jdbc clojure

这是我第一次涉足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视为'这个'那时应该是协议正确吗?很抱歉,如果这是一个noob类型问题(我确定是这样),但我只是没有看到问题,我需要一些Clojure专业知识来帮助我克服这个非常小的障碍!

1 个答案:

答案 0 :(得分:2)

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

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

到此:

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

我仍然不确定为什么,在这种情况下,我需要完全限定函数名称,因为这应该引用我正在扩展的类型(或者我认为)。如果某人有更多关于为什么需要合格的说明,我会很高兴听到它。