Datomic 中的数据库函数,特别是事务数据库函数,对于保持一致性非常有用。在文档中的例子是用 edn 来写的。象这样:

;;add a transaction function called add-doc
[{:db/id #db/id [:db.part/user]
  :db/ident :add-doc
  :db/fn #db/fn {:lang "java"
                 :params [db e doc]
                 :code "return list(list(\":db/add\", e, \":db/doc\", doc));"}}]

其中的引号还要 Escape,实在有些不顺眼。好在 datomic 的 Clojure API 提供了 function 函数:

(def add-doc
  "Add document to an entity"
  (d/function {:lang "clojure"
               :params '[db e doc]
               :code '[[:db/add e :db/doc doc]]}))

这样实现的好处不只是使用 ' 来创造 quote 的代码,它的另一个玄机在于它返回了一个真正的函数!这个 add-doc 是可以在你的本地代码上调用的,这让单元测试数据库函数成为可能。

将这个函数安装到数据库:

[{:db/id #db/id [db.part/user]
  :db/doc (-> #'add-doc meta :doc) ;重用上面的文档
  :db/fn add-doc}]

robertluo
738 声望21 粉丝

引用和评论

0 条评论