在 Datomic 中查找最后一笔交易的实体 ID?
Find entity id of last transaction in Datomic?
我想知道如何通过 Datomic 中的最新交易找到 modified/created/deleted 实体的 ID。我该怎么做?
对于这种读取模式(基于时间),您需要使用 Log API。请注意:
- 可能不止一个实体受到最后一笔交易的影响。
- 实际上,交易本身由为该交易创建的实体表示,您可能希望从结果中过滤掉它。
这是一个示例实现:
(defn affected-entities
"Given a Datomic connection, returns the set of entity ids that were affected
by the last transaction (in e position), excluding the entity representing the
transaction itself."
[conn]
(let [db (d/db conn)]
(->>
(d/q '[:find [?e ...] :in ?log ?t1 ?t2 :where
[(tx-ids ?log ?t1 ?t2) [?tx ...]] ;; binds the last tx
[(tx-data ?log ?tx) [[?e]]]]
(d/log conn) (d/basis-t db) (d/next-t db))
;; filtering out the transaction entity
(remove (fn [eid]
(->> eid d/part (d/ident db) (= :db.part/tx))))
set)))
我想知道如何通过 Datomic 中的最新交易找到 modified/created/deleted 实体的 ID。我该怎么做?
对于这种读取模式(基于时间),您需要使用 Log API。请注意:
- 可能不止一个实体受到最后一笔交易的影响。
- 实际上,交易本身由为该交易创建的实体表示,您可能希望从结果中过滤掉它。
这是一个示例实现:
(defn affected-entities
"Given a Datomic connection, returns the set of entity ids that were affected
by the last transaction (in e position), excluding the entity representing the
transaction itself."
[conn]
(let [db (d/db conn)]
(->>
(d/q '[:find [?e ...] :in ?log ?t1 ?t2 :where
[(tx-ids ?log ?t1 ?t2) [?tx ...]] ;; binds the last tx
[(tx-data ?log ?tx) [[?e]]]]
(d/log conn) (d/basis-t db) (d/next-t db))
;; filtering out the transaction entity
(remove (fn [eid]
(->> eid d/part (d/ident db) (= :db.part/tx))))
set)))