收回:来自实体的db / ident

时间:2017-07-10 11:15:26

标签: clojure datomic

我有一堆特殊的实体,但它们不是数据库模式的一部分。由于这些实体很特殊,我为它们设置了一些:db/ident属性,以便在我的程序中轻松访问它们。

让我说我打电话给其中一个帐户:base-account现在的问题是,当我使用实体api访问这些实体时,我遇到了这个问题:

;; access some entity that references one of the special entities
> (d/touch (d/entity db 12345678))
==> 
{:transaction/amount 22334455,
 :transaction/from {:db/id 0987654}, ;; normal reference to an entity
 :transaction/to :base-account} ;; this is a reference to a special account with a :db/ident attribute

这导致我之前编写的一些代码出现问题,因为这不会向我提供:transaction/to帐户的详细信息。

为了解决这个问题,我从这些实体中删除了:db/ident属性:

> (d/transact connection [[:db/retract id-of-the-special-account
                           :db/ident :base-account]])

成功从实体中删除了:db/ident

> (:db/ident (d/entity db id-of-the-special-account))
==> nil

但由于某种原因(可能是一个错误),实体api调用仍然用它的旧身份引用它:

> (d/entity db :base-account) ;; should not work
==> {:db/id id-of-the-special-account}

那么如何从这些实体中删除标识而不必将它们从数据库中删除呢?或者也许是一种以理智的方式修复(d/entity ....)调用方式的方法?

编辑:我正在使用datomic-pro-5544

1 个答案:

答案 0 :(得分:1)

来自the Datomic Docs

  

Idents应该用于两个目的:命名模式实体和   实现枚举标签。这两种用途都在中国得到了证明   入门教程。为了支持这些用法,idends有两个   特色:

     
      
  • Idents的设计非常快,始终可用。与数据库关联的所有标识都存储在每个标识符的内存中   Datomic transactor and peer。
  •   
  • 当您将实体API导航到具有ident的引用时,查找将返回ident,而不是其他实体。
  •   

最后一个要点可能会影响到你。

下一段:

  

这些特征也意味着同意不应该出现的情况   使用:

     
      
  • 不应将Idents用作普通域实体的唯一名称或ID。这样的实体名称应该用a来实现   特定于域的属性,它是唯一的标识。
  •   
  • 不应将Ident用作测试数据的名称。 (您的真实数据不会有这样的名称,并且您不希望测试数据表现出来   与它模拟的真实数据不同。)
  •   

从这看起来您似乎可能想要重新设计数据库,而不是试图取消对:db/ident的使用。