如何从Datomic的'transact'获取详细信息/错误消息

时间:2014-07-16 01:23:05

标签: clojure datomic

使用Clojure repl下面的'load-data'(使用教程https://github.com/swannodette/om/wiki/Intermediate-Tutorial中的'util.clj'和修改后的模式和初始数据集)将数据加载到新的Datomic数据库中,数据确实如此没有出现在Datomic控制台中。

但是,从repl执行'load-data'操作时,我没有收到任何错误消息。

架构在Datomic控制台中按预期显示。使用教程中未修改的代码,我可以看到模式和数据。

我必须在设置初始数据的代码中遇到问题。但我不知道它在哪里,因为没有错误信息。

如何从Datomic数据库的init事务中获取错误消息和其他详细信息?

代码:

(defn transact-all [conn f]
  (doseq [txd (read-all f)]
    (d/transact conn txd))
  :done)

(defn load-schema []
  (transact-all (get-conn) (io/resource "data/schema.edn")))

(defn load-data []
  (transact-all (get-conn) (io/resource "data/initial.edn")))

;; Logging provides some comparison with the known working scenario, but so far I only can log entity id's:

(defn read-log []
  (d/q '[:find ?e
         :in ?log ?t1 ?t2
         :where [(tx-ids ?log ?t1 ?t2) [?tx ...]]
         [(tx-data ?log ?tx) [[?e]]]]
       (d/log (get-conn)) #inst "2014-07-14" #inst "2015-07-01")
)

1 个答案:

答案 0 :(得分:1)

在Clojure中,您可以使用@或deref来获取交易结果,例如:

@(d/transact conn txd)

它返回的地图在d/transact的文档中描述: http://docs.datomic.com/clojure/#datomic.api/transact

特别参见:

  

如果事务中止,尝试获取未来的值将抛出java.util.concurrent.ExecutionException,包装包含错误信息的java.lang.Error。如果事务超时,则对transact本身的调用将抛出RuntimeException。事务超时可以通过系统属性datomic.txTimeoutMsec设置,默认为10000(10秒)。

无效的事务也会抛出IllegalArgumentException(或其他一些例外)。