我想收回一个实体,同时指定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
属性?
答案 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的前奏)中关于这一主题的详细视频: