我正试图在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是用于声明的,而不是一般赋值。