2

这将产生两个不同的 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])

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

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

有任何想法吗?

为了清楚起见,文档说:“每次调用 tempid 都会产生一个唯一的临时 ID。”

[在@maxthoursie 发表评论后编辑,无论如何repeat都会遇到这个问题。]

4

2 回答 2

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。

于 2013-11-16T15:06:31.457 回答
0

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

反复使用。

请参阅http://clojuredocs.org/clojure_core/clojure.core/repeatedly上的示例

于 2013-11-16T08:11:26.970 回答