clojure - 在 datomic 中获取插入实体的 ID?

标签 clojure datomic

在 datomic 中运行事务以插入值后,如何使用事务的返回值来获取创建的任何实体的 ID?

这是我在插入后得到的返回值示例:

#<promise$settable_future$reify__4841@7c92b2e9: {:db-before datomic.db.Db@62d0401f, :db-after datomic.db.Db@bba61dfc,
 :tx-data [#Datum{:e 13194139534331 :a 50 
:v #inst "2013-06-19T11:38:08.025-00:00" 
:tx 13194139534331 :added true} #Datum{:e 17592186045436 .....

我可以看到底层数据……我如何提取它们的值?

最佳答案

使用 d/resolve-tempid .如果您要处理单个实体,请查看 :tx-data会起作用,但如果您的交易包含多个实体,那么您将不知道它们出现在 :tx-data 中的顺序。 .

您应该做的是使用 (d/tempid) 为您的实体(在处理它们之前)提供临时 ID。或其文字表示 #db/id[:db.part/user _negativeId_]然后使用 d/resolve-tempid从您的临时 id 到数据库给出的真实 id。代码如下所示:

(d/resolve-tempid (d/db conn) (:tempids tx) (d/tempid :db.part/user _negativeId_))

完整版代码示例 ,看到这个 gist .

关于clojure - 在 datomic 中获取插入实体的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17190334/

相关文章:

Clojureql - 无法获取宏的值(clojure)

clojure - Clojure 中 defn 的用途

vim - 从命令行自动缩进 .lisp 文件并使用 slimv 进行缩进

datomic - 当向同一属性添加相同的值时,Datomic 会做什么?

clojure - 多次添加相同的数据不是最理想的吗?

logging - 控制台上未显示 Clojure Web 服务中的基本日志记录

dictionary - 如何在不知道 Clojure 中的键的情况下将映射分解为键值对?

clojure - Clojure 的分析工具?

clojure - 使用什么数据类型才能使 1 和 1.0 在 Datomic 中都有效?

clojure - 对于此模式,在 Datomic 领域中更惯用的选项是什么?