为什么Datomic在迭代时连续两次产生相同的临时ID?

时间:2013-11-16 07:30:36

标签: clojure datomic

这将生成两个不同的ID,这很棒:

#db/id[:db.part/user]
#db/id[:db.part/user]

但是下面的内容(我到目前为止尝试过很多想法)会产生两次相同的ID,这不是我想要的:

(repeatedly 2 (fn [] #db/id[:db.part/user]))
(for [n [1 2]] #db/id[:db.part/user])

所有产生类似

的东西
(#db/id[:db.part/user -1000774] #db/id[:db.part/user -1000774])

每次通话产生的号码相同。

我真正想要的是调用NOT根本不生成数字,这样我就可以通过事务添加生成的数据。

有什么想法吗?

为了清楚起见,the documentation说,“每次对tempid的调用都会产生一个独特的临时ID。”

[@maxthoursie评论后编辑repeat在任何情况下都会遇到此问题。]

2 个答案:

答案 0 :(得分:5)

使用

(require '[datomic.api :as d])
(repeatedly 2 #(d/tempid :db.part/user))
;; => (#db/id[:db.part/user -1000118] #db/id[:db.part/user -1000119])

考虑#...是读者宏,这意味着当读取表达式时,它们的值将被解析,这自然只会发生一次。仅在编写文字事务数据(如模式)时才使用#...宏。使用datomic.api / tempid在运行时生成tempid。

答案 1 :(得分:0)

因为repeat正在重复从调用id一次获得的值。

反复使用。

请参阅http://clojuredocs.org/clojure_core/clojure.core/repeatedly

上的示例