【问题标题】:Datomic not a valid :uri for attributeDatomic 不是有效的 :uri 属性
【发布时间】:2020-05-03 14:02:00
【问题描述】:

我正在尝试在定义为的属性上插入一个值

{:db/ident       :foo/uri
 :db/valueType   :db.type/uri
 :db/cardinality :db.cardinality/one
 :db/doc         "Test attribute of value type uri."}

我正在插入

{:foo/uri "scheme://host/path"}

得到

Execution error (ExceptionInfo) at datomic.client.api.async/ares (async.clj:58).
Value scheme://host/path is not a valid :uri for attribute :foo/uri

我不知道在此处插入什么。它应该是一个字符串,对吧?没有读者文字?

我在网上找到了零个这样的例子。还查看了与此相对应但没有照明的java class。或者它可能需要java.net.URI 的实例,所以要将它放入edn,我们需要安装我们自己的阅读器文字?

【问题讨论】:

    标签: clojure datomic


    【解决方案1】:

    它确实需要是java.net.URI 的实例。

    如果它是您代码的一部分,您可以在创建它时将其包装起来:

    {:foo/uri (new java.net.URI "scheme://host/path")}
    

    如果您想从 edn 文件中读取它,那么您可以在文件中使用自定义标签,例如 #URI,并将自定义阅读器函数作为选项传递给 edn/read-string

    ;;; in some file located at `path`
    {:foo/uri #URI"scheme://host/path"}
    
    ;;; code to read the file at `path`
    (require '[clojure.edn :as edn])
    (-> path
        slurp
        (edn/read-string {:readers {'URI #(new java.net.URI %)}})
    

    您也可以使用clojure.tools.reader 执行此操作,这会导致不安全的代码执行(因此可能不推荐):

    ;;; use reader tools
    (require '[clojure.tools.reader :as r])
    (r/read-string "{:foo/uri #=(new java.net.URI \"scheme://host/path\")}")
    

    【讨论】:

    • 谢谢,成功了——我已经在使用一个函数(每个“实体”),在将属性映射发送到事务之前对其进行管道化,并进行了一些方便的转换。因此,现在检查 uri 的属性,并为字符串交换所需的 java 对象。这样,所有客户端代码都可以只为 uri 属性传递一个纯字符串;转换在一个地方完成。
    • 你有理由使用 dt.type/uri 属性吗?为什么不将其作为 db.type/string (一直向下的字符串!)存储在数据库中,并且仅在需要时在数据库外部转换为 URI。我问是因为我目前正在争论是否使用 db.type/uri 或 db.type/string 并且不确定转换是否值得。
    • 我没有理由必须使用它,我知道 - 我问自己同样的问题 - 解释:我现在只是相信它,因为存在 uri 类型,它增加了一些价值;尚不清楚那是什么。还没有实时部署任何东西,所以会在任何部署之前审查决定。是的,很可能会切换回字符串。
    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2011-02-05
    • 2011-07-02
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多