建立 datomic 的数据库函数

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

;;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 函数:java

(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 是能够在你的本地代码上调用的,这让单元测试数据库函数成为可能。数据库

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

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