我能够从现有的Clojure数据中创建实体。但是,我无法将现有实体附加到我尝试创建的实体。如果架构中有:ref :one
,我可以放置eid
或:db/id
吗?我试过了两个,但只收到了错误消息。在以下代码中,:statement/bank-account
的架构定义为:ref :one
,read-account
函数成功检索现有(银行)帐户实体:
(defn read-account [conn account-name]
(let [db (d/db conn)]
(d/q '[:find ?a
:in $ ?an
:where
[?a :account/name ?an]
] db account-name)))
(defn make-statement [conn {:keys [bank-acct-name]}]
(let [db (d/db conn)
bank-acct-id (->> bank-acct-name
(read-account conn)
;; (d/pull db [:db/id])
first
)]
{:db/id (d/tempid :db.part/user)
:base/type :statement
:statement/bank-account bank-acct-id
}))
此代码提供IllegalArgumentExceptionInfo :db.error/invalid-lookup-ref Invalid list form: [17592186045426] datomic.error/arg (error.clj:57)
。如果我注释掉first
,我会收到完全相同的错误消息,这让我很困惑。如果我取消评论(d/pull db [:db/id])
,我会IllegalArgumentExceptionInfo :db.error/not-an-entity Unable to resolve entity: :db/id datomic.error/arg (error.clj:57)
。
编辑在回答此问题的过程中,我发现eid
和:db/id
是相同的。
答案 0 :(得分:1)
您的查询会返回一组1元组,例如#{[1] [42] [323142] ...}
您想要将其更改为仅返回一个值:
[:find ?a . ;; mind the '.'
:in $ ?an
:where
[?a :account/name ?an]
]
对于这个函数的功能,你可能不需要使用pull - 这个eid就足够了。