创建引用现有实体的实体
Create entity that refers to an existing entity
我能够从现有的 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
是一回事。
您的查询 return 是一组一元组,例如 #{[1] [42] [323142] ...}
您需要将其更改为 return 只有一个值:
[:find ?a . ;; mind the '.'
:in $ ?an
:where
[?a :account/name ?an]
]
对于此函数的作用,您可能不需要使用 pull - eid 本身就足够了。
我能够从现有的 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
是一回事。
您的查询 return 是一组一元组,例如 #{[1] [42] [323142] ...}
您需要将其更改为 return 只有一个值:
[:find ?a . ;; mind the '.'
:in $ ?an
:where
[?a :account/name ?an]
]
对于此函数的作用,您可能不需要使用 pull - eid 本身就足够了。