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

时间:2013-02-03 18:49:58

标签: datomic

我正在尝试在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]]>

有任何线索吗?

1 个答案:

答案 0 :(得分:2)

在您调用 create-partition 之前,您正在引用旧数据库值的查询。因此,您看不到对数据库所做的更改。

事实上,你被Datomic最有用和最有特色的功能之一所困:“时间旅行”的能力。

如果要查看数据库中的最新数据,则应在查询前获取新的数据库值,例如:在函数分区中代替 mdb ,您应该写(db conn)

顺便说一句,一般来说,如果你经常在函数内部使用 def ,那么你就会为自己提出问题,因为 def 用于声明,而不是一般的赋值。