使用Datomic中设置的某个db / txInstant撤消实体?

时间:2016-10-05 09:17:23

标签: clojure datomic

我想收回一个实体,同时指定db/txInstant属性,但我无法让它工作。撤回实体看起来像这样(这有效):

[[:db.fn/retractEntity [:person/email "jdoe@example.com"]]]

我尝试了各种方法来提供db/txInstant属性,例如:

[[:db.fn/retractEntity [:person/email "jdoe@example.com"]]
 [:db/txInstant <inst>]]

但是失败了:

Caused by: datomic.impl.Exceptions$IllegalArgumentExceptionInfo: :db.error/not-a-data-function Not a data function: 50
 at datomic.error$arg.invoke (error.clj:57)
    datomic.error$arg.invoke (error.clj:55)
    datomic.db.Db.getFn (db.clj:1794)
    datomic.db.ProcessExpander.inject (db.clj:2473)
    datomic.db.ProcessInpoint.inject (db.clj:2372)
    datomic.db$with_tx$inject_all__2222$fn__2223.invoke (db.clj:2535)
    clojure.lang.PersistentVector.reduce (PersistentVector.java:341)
    clojure.core$reduce.invokeStatic (core.clj:6544)
    clojure.core$reduce.invoke (core.clj:6527)
    datomic.db$with_tx$inject_all__2222.invoke (db.clj:2535)
    datomic.db$with_tx.invoke (db.clj:2539)
    datomic.peer.LocalConnection/fn (peer.clj:557)
    datomic.peer.LocalConnection.transactAsync (peer.clj:557)
    datomic.peer.LocalConnection.transact (peer.clj:549)
    datomic.api$transact.invoke (api.clj:94)
    ....

所以我的问题是在撤回Datomic中的实体时如何指定db/txInstant属性?

3 个答案:

答案 0 :(得分:2)

这对我有用:

(d/transact conn [{:db/id        #db/id [:db.part/tx]
                   :db/txInstant #inst "2016-10-29"}
                  [:db.fn/retractEntity [:person/email "jdoe@example.com"]]])

答案 1 :(得分:1)

txInstant,据我所知,是指定更改的事务的时间,无论是撤回还是添加,都发生了。所以,如果你在这方面取得成功,你基本上是对交易者说:

“嘿,那里的交易者请创建一个交易,现在发生在其他时间,而不是现在”

这会破坏数据库中所有其他时间的语义。这就是我们通常在datomic中使用命名空间关键字的原因。

而不是设置:db/txInstant设置:my.company.db/txInstant 。通过这种方式,您可以找出交易所确定的交易时间,并且系统的其余部分可以确定交易者何时创建交易,这将使事件流保持愉快。

答案 2 :(得分:0)

如果您需要将元数据附加到事务(例如tx发生的原因或任何相关数据),您可以这样做。您可以在Datomic网站上获得很好的信息:

http://docs.datomic.com/transactions.html

http://blog.datomic.com/2015/12/reified-transactions.html

以及Tim Ewald在2015年11月的Datomic会议(Clojure Conj的前奏)中关于这一主题的详细视频:

http://www.datomic.com/videos.html