Clojure 收回:实体中的db/ident

Clojure 收回:实体中的db/ident,clojure,datomic,Clojure,Datomic,我有一些特殊的实体,但它们不是db模式的一部分。由于这些实体是特殊的,我为它们设置了一些:db/ident属性,以便在我的程序中轻松访问它们 假设我调用其中一个帐户:base account,现在的问题是,当我使用实体api访问这些实体时,我遇到了以下问题: ;; access some entity that references one of the special entities > (d/touch (d/entity db 12345678)) ==> {:transa

我有一些特殊的实体,但它们不是db模式的一部分。由于这些实体是特殊的,我为它们设置了一些
: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
但出于某种原因(可能是一个bug),实体api调用仍然使用其旧标识引用它:

> (d/entity db :base-account) ;; should not work
==> {:db/id id-of-the-special-account}
那么,如何从这些实体中删除标识,而不必从数据库中完全删除它们呢?或者是一种方法来修复
(d/entity…)
调用的工作方式,以一种合理的方式

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

标识应用于两个目的:命名模式实体和 实现枚举标记。这两种用途在 介绍性教程。为了支持这些用法,ident有两个 特点:

  • 识别码的设计速度非常快,并且始终可用。与数据库关联的所有标识都存储在每个数据库的内存中 Datomic交易方和对等方
  • 将实体API导航到具有标识的引用时,查找将返回标识,而不是另一个实体
最后一点可能是影响你的因素

下一段:

这些特征还意味着不应使用标识的情况 使用:

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

由此看来,您可能希望重新设计数据库,而不是尝试取消使用
:DB/ident

这可能是一个愚蠢的问题,但我不得不问。您是否使用与交易收回前相同的
db
值?这件事发生在我身上的次数比我想在回复中承认的要多。。。特别是当通过另一个通道(如compojure)更改数据时,在REPL中使用一个过时的db时,我不禁要问为什么数据仍然存在…@KennethKalmer我知道你的意思,为了避免这个问题,我使用了一个小的
(db)
函数,它总是获取db的最新值。我只是没有把它写在上面的代码中以避免解释;)这是在伤我的大脑,我真的想给出一个好的答案。。。
:transaction/to
值类型是什么?它是
:db.type/ref
?交易本身是否仍然持有对
:基本账户的引用?您是否更新了
:transaction/to
的值以供
:db/id
引用?@KennethKalmer
:transaction/to
:transaction/from
都是引用类型,我认为ref类型始终具有目标实体的
:db/id
的值。我可以用
(d/pull(db)[*]id of some transaction)
来测试这一点,它以以下格式给出结果:
{:db/id…:transaction/amount…:transaction/from{:db/id…}:transaction/to{:db/id…}