我正在尝试在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]]>
有任何线索吗?
答案 0 :(得分:2)
在您调用 create-partition 之前,您正在引用旧数据库值的查询。因此,您看不到对数据库所做的更改。
事实上,你被Datomic最有用和最有特色的功能之一所困:“时间旅行”的能力。
如果要查看数据库中的最新数据,则应在查询前获取新的数据库值,例如:在函数分区中代替 mdb ,您应该写(db conn)。
顺便说一句,一般来说,如果你经常在函数内部使用 def ,那么你就会为自己提出问题,因为 def 用于声明,而不是一般的赋值。