如何在Datomic中收回属性?

时间:2014-09-05 11:21:14

标签: clojure datomic

我在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架构更改必须后跟:db.install / attribute或:db.alter / attribute

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

谢谢!

2 个答案:

答案 0 :(得分:6)

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

请注意,您可以重命名属性,但它仍然保留其旧身份作为同义词,除非您将其重新用于其他内容。

答案 1 :(得分:1)

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

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