将 Clojure Spec 与 Datomic 实体结合使用
Using Clojure Spec with Datomic entities
假设我有以下规格:
(s/def :person/age number?)
(s/def :person/name string?)
(s/def ::person (s/keys :req [:person/name :person/age]))
然后我从 Datomic 获取实体:
(def person-entity (d/entity (d/db conn) [:person/name "Mr entity"]))
如果我尝试检查与规范的一致性,它会失败,因为实体不是地图:
(s/explain ::person person-entity)
val: #:db{:id 17592186069950} fails spec: :some-ns/person predicate: map?
我的应用程序具有将实体作为参数的函数,并且希望避免为了让规范工具在开发中工作而必须将实体具体化到任何地方的映射。
我应该如何通过规范验证实体?
虽然您的命名空间确实有点偏离(您应该使用 :person/name 而不是 ::name),但规范中也有一个可以取消的限制。当前 s/keys 要求所有输入集合都符合 clojure.core/keys
谓词。 Datomic 实体不是映射,因此不会通过该检查(因此会出现关于 map?
谓词的错误)。
我已经在此处提交了错误报告:http://dev.clojure.org/jira/browse/CLJ-2041 如果您愿意,请随时 upvote/follow 提交问题单。
假设我有以下规格:
(s/def :person/age number?)
(s/def :person/name string?)
(s/def ::person (s/keys :req [:person/name :person/age]))
然后我从 Datomic 获取实体:
(def person-entity (d/entity (d/db conn) [:person/name "Mr entity"]))
如果我尝试检查与规范的一致性,它会失败,因为实体不是地图:
(s/explain ::person person-entity)
val: #:db{:id 17592186069950} fails spec: :some-ns/person predicate: map?
我的应用程序具有将实体作为参数的函数,并且希望避免为了让规范工具在开发中工作而必须将实体具体化到任何地方的映射。
我应该如何通过规范验证实体?
虽然您的命名空间确实有点偏离(您应该使用 :person/name 而不是 ::name),但规范中也有一个可以取消的限制。当前 s/keys 要求所有输入集合都符合 clojure.core/keys
谓词。 Datomic 实体不是映射,因此不会通过该检查(因此会出现关于 map?
谓词的错误)。
我已经在此处提交了错误报告:http://dev.clojure.org/jira/browse/CLJ-2041 如果您愿意,请随时 upvote/follow 提交问题单。