Datomic mem或free中的分区不起作用



我正试图在Datomic(free或mem)中创建一个分区,但当被查询时,新分区不会出现,并且在尝试使用它时出现异常。这种行为是free模式或mem模式固有的吗?

(defn create-mdb []
  (def uri "datomic:mem://localhost:4334//billing")
  (d/create-database uri)
  (def conn (d/connect uri))
  (def mdb (db conn))
)
(defn create-partition []
  (d/transact conn [
    {:db/id (d/tempid :db.part/db)
     :db/ident :billing
     :db.install/_partition :db.part/db}
]))
(defn partitions []
  (d/q '[:find ?ident 
     :where 
     [:db.part/db :db.install/partition ?p]
     [?p :db/ident ?ident]
   ] mdb))
=> (create-mdb)
#'ww.billing/mdb
=> (create-partition)
#<promise$settable_future$reify__4637@714cf72c: {:db-before datomic.db.Db@193e901b, :db-after datomic.db.Db@eeb64b5b, :tx-data #<ArrayList [datomic.db.Datum@a15d2d7d, datomic.db.Datum@9f207ac0, datomic.db.Datum@7e4]>, :tempids {-9223367638809264704 62}}>
=> (partitions)
#<HashSet [[:db.part/db]]>

有线索吗?

在查询中,您正在引用一个旧的数据库值,该值来自您调用创建分区之前的值。因此,您看不到对数据库所做的更改。

事实上,你正在被Datomic最有用和最显著的特征之一所咬:"时间旅行"的能力。

如果你想查看数据库中的最新数据,你应该在查询之前获得一个新的数据库值,例如,你应该写(db-conn),而不是函数partitions中的mdb

顺便说一句,如果您经常在函数内部使用def,那么通常情况下,您会自己问问题,因为def是用于声明的,而不是一般赋值。

最新更新