Clojure 收回:实体中的db/ident
我有一些特殊的实体,但它们不是db模式的一部分。由于这些实体是特殊的,我为它们设置了一些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/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…}