Clojure RuntimeException - 标签db / id没有读取器功能

时间:2017-08-23 01:31:12

标签: clojure clojurescript datomic edn

当我在Clojure中收到此错误时会发生什么?

java.lang.RuntimeException: No reader function for tag db/id

1 个答案:

答案 0 :(得分:7)

标记文字

此错误消息与Clojure 1.7中引入的功能有关, tagged literals。标记文字是一种简单的扩展方式 在Clojure代码中可以将哪些数据类型表示为文字或EDN 数据

Clojure附带两个标记文字的读者,#inst#uuid允许java.util.Datejava.util.UUID的文字表示 data_readers.clj。通过包含可以添加对更多标签的支持 类路径上的#db/id个文件为described in the documentation

常见原因

此错误的一些常见原因:

  • 尝试阅读包含:readers文字
  • 的Datomic交易数据
  • 尝试使用EDN reader而未通过*data-readers*
  • 在试图通过传递使用EDN阅读器的Boot任务中 :readers

使用EDN阅读器

此错误的一个常见原因是尝试使用EDN reader 没有传递clojure.edn/read选项。来自doc字符串 :readers - a map of tag symbols to data-reader functions to be considered before default-data-readers. When not supplied, only the default-data-readers will be used.

default-data-readers

顾名思义,data_readers.clj 数据地图 与Clojure本身一起提供的读者。也就是说,它不包括在内 任何库的*data-readers*文件中定义的任何读者 你正在使用(比方说,像Datomic)。在这种情况下的解决方案是 传递var中找到的当前加载数据读取器集 (clojure.edn/read {:readers *data-readers*} <your-read-source>)

(require 'datomic.db
         'datomic.function
         'datomic.codec)

(edn/read {:readers {'db/id  datomic.db/id-literal
                     'db/fn  datomic.function/construct
                     'base64 datomic.codec/base-64-literal}}
          <your-read-source-here>)

或者,更好的是,明确指定数据读取器的映射 你想用。例如,如果您希望只能使用 数据库数据阅读器:

default-data-readers

当然,因为这些只是我们正在处理的clojure地图, 我们还可以通过合并地图来包含(require 'datomic.db 'datomic.function 'datomic.codec) (edn/read {:readers (merge default-data-readers {'db/id datomic.db/id-literal 'db/fn datomic.function/construct 'base64 datomic.codec/base-64-literal})} <your-read-source-here>)

fedIncome