Clojure 为什么Datomic在迭代时一行两次生成相同的临时ID?
这将产生两个不同的ID,这很好:Clojure 为什么Datomic在迭代时一行两次生成相同的临时ID?,clojure,datomic,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.par
#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
在任何情况下都会有此问题。]因为repeat重复调用id一次所得到的值
反复使用
参见使用中的示例
(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。Thx,我忘了这一点。但是,我们还没有到那里,我可能不得不使用实际的有问题的代码来回答我的问题,因为
(重复2(fn[].\db/id[:db.part/user])和(for[n[12].\db/id[:db.part/user])
都会产生类似于(db/id[:db.part/user-1000774].\db/id[:db.part/user-1000774])的结果,生产的号码是相同的。好的,对不起。在您链接到的文档中看到了这样的文本:“如果给定的临时id在给定的事务中被多次使用,那么所有实例都映射到相同的实际实体id。”我想这就是问题所在。但我对datomic了解太少,无法提供解决方案,谢谢。只是偶然发现了其中显示的代码示例。