【问题标题】:Query to list all partitions in Datomic查询以列出 Datomic 中的所有分区
【发布时间】:2012-09-16 18:03:51
【问题描述】:

什么是列出 Datomic 数据库所有分区的查询?

这应该返回

[[:db.part/db] [:db.part/tx] [:db.part/user] .... ]

其中.... 是所有用户定义的分区。

【问题讨论】:

    标签: database clojure datomic


    【解决方案1】:

    您应该能够通过:db.install/partition 属性搜索与:db.part/db 实体关联的所有实体来获取数据库中所有分区的列表:

    (ns myns
      (:require [datomic.api :as d]))
    
    (defn get-partitions [db]
      (d/q '[:find ?ident :where [:db.part/db :db.install/partition ?p]
                                 [?p :db/ident ?ident]]
           db))
    

    注意

    当前版本的 Datomic(内部版本 0.8.3524)有一个缺点,即 :db.part/tx:db.part/user(三个内置分区中的两个)被特殊处理,实际上并没有通过 :db.part/db 关联:db.install/partition,所以上面查询函数的结果不会包含这两个。

    这个问题is going to be addressed 在 Datomic 的未来版本之一中。同时,您应该注意自己在结果集中包含:db.part/tx:db.part/user

    【讨论】:

      【解决方案2】:

      第一种方法 - 使用查询

      => (q '[:find ?i :where 
             [:db.part/db :db.install/partition ?p] [?p :db/ident ?i]]
           (db conn))
      

      第二种方法 - 来自 db 对象

      (filter #(instance? datomic.db.Partition %) (:elements (db conn)))
      

      第二种方法返回 datomic.db.Partition 对象的序列,如果我们想获取有关分区的其他信息,这可能很有用。

      这两种方法都有已知的错误/不一致:它们不返回 :db.part/tx 和 :db.part/user 内置分区。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-17
        • 1970-01-01
        • 2019-05-05
        • 2019-11-02
        • 1970-01-01
        相关资源
        最近更新 更多