建立 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}]
相關文章
相關標籤/搜索