【问题标题】:How to retract attributes in Datomic?如何收回 Datomic 中的属性?
【发布时间】:2014-09-05 11:21:14
【问题描述】:

我在 Datomic 模式中创建了一组属性。它们的 :db/idents 分为三个命名空间::name、:tree、:node。现在我想删除所有这些并重新开始。我找到了所有必需的属性:

(def results 
  (q '[:find ?e 
       :where [?e :db/ident ?v]
              [(namespace ?v) ?res]
              [(contains? #{"task", "node", "tree"} ?res)]
     ] 
     (db conn)))

然后创建了一组retractEntity 语句:

(def retract-statements 
  (into [] (map #(vector :db.fn/retractEntity (first %1)) results)))

现在我正在尝试调用事务:

@(d/transact conn [retract-statements])

它给了我: :db.error/invalid-attribute Schema 更改后必须跟 :db.install/attribute 或 :db.alter/attribute

显然我做错了什么。有人可以帮忙吗?

谢谢!

【问题讨论】:

  • 你的向量嵌套太多了吗?你需要做@(d/transact conn retract-statements),而不是`@(d/transact conn [retract-statements]) - 因为retract-statements 已经是向量的向量。只是一个想法......
  • 我刚刚使用了 (delete-database uri) 和 (create-database uri),这对我的目的来说非常好。似乎没有办法收回属性 - 似乎摆脱所有属性的唯一可行方法是重命名。这是一个正确的说法吗?

标签: clojure datomic


【解决方案1】:

在 Datomic 中无法直接收回属性。一旦你安装了一个属性,它就会永远存在,除非你删除整个数据库。这是有道理的,因为 Datomic(删除的特殊情况除外)永远不会真正删除任何数据 - 如果您实际上可以删除属性,那么最初针对这些属性进行交易的数据将无法检索。

请注意,您可以重命名属性,但它仍将其旧标识保留为同义词,除非您将其重新用于其他用途。

【讨论】:

    【解决方案2】:

    虽然您确实无法撤回架构,但您可以撤回有关属性的所有内容(有关该属性的所有内容都可以通过 AEVT 索引找到),然后将该属性标记为不使用。例如,您可以使用 :db/doc 字符串来执行此操作。

    如果你真的希望它消失,你可以删除该属性。如果你这样做,你会失去历史,但它会从轨道上删除属性。如果要删除属性,请先备份数据库,因为如果删除错误,数据将无法恢复

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多