Fel*_*ipe 7 database clojure database-metadata datomic
我想知道例如何时创建或更新实体.我应该创建一个类似于:created-at
和/ :update-at
或Datomic的属性默认情况下具有这些属性吗?或以任何方式找出实体的创建或更新时间?
Ben*_*aus 13
时间是Datomic设计的基础.Datomic的时间观点的一部分是,实体不会像在传统的CRUD数据库中那样被创建或更新,其中行被插入到表中,而新事实会覆盖行中的旧事实.相反,有关实体的事实会随着时间的推移而被断言和收回.鉴于这种不可改变的历史,Datomic知道它是如何处于当前状态的.您可以随时间收集有关历史数据库的数据结构的信息:
http://docs.datomic.com/clojure/#datomic.api/history
因此,要回答有关add-at和updated-at的问题,您可以依赖Datomic的内置时间感知.有关何时创建事物的查询 - 这里有两个选项.如果您的模式包含某种类型的唯一标识符,则可以限制查询在创建此属性时引用事务(在首次添加实体时应该是一次):
(d/q '[:find ?e ?tx-time
:where
[?e :user/id _ ?tx]
[?tx :db/txInstant ?tx-time]]
db)
Run Code Online (Sandbox Code Playgroud)
如果在初始化时不能依赖属性,则可以使用历史数据库为与实体对应的所有事务花费最少的时间,例如在此参数化查询中:
(d/q ':find ?e (min ?tx-time)
:in $ ?e
:where
[?e _ _ ?tx _]
[?tx :db/txInstant ?tx-time]
(history db) entity-id)
Run Code Online (Sandbox Code Playgroud)
请注意,这种方式会更慢,但可能更强大.如果你想要最新的事实主张("更新"),你可以子max
的min
.