这将产生两个不同的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 无论如何都会有这个问题。]

有帮助吗?

解决方案

使用方法

(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。

其他提示

因为repeat是重复它从调用id得到的值一次。

反复使用代替。

见例子在 http://clojuredocs.org/clojure_core/clojure.core/repeatedly

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top