0

Datomic (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]]>

手がかりはありますか?

4

1 に答える 1

2

クエリでは、 create-partitionを呼び出す前から、古いデータベース値を参照しています。したがって、データベースに加えた変更は表示されません。

実際のところ、Datomic の最も便利で特徴的な機能の 1 つである「タイムトラベル」機能に悩まされています。

データベース内の最新のデータを表示したい場合は、クエリを実行する前に新しいデータベース値を取得する必要があります。関数partitionのmdbの代わりに、(db conn)と書く必要があります。

ところで、一般的に、関数内でdefを日常的に使用する場合、 defは一般的な代入ではなく宣言を意味するため、自分で問題を求めています。

于 2013-02-12T14:14:44.070 に答える