既存の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
が同じことを発見しました。 「この関数が何を、あなたはおそらくドンについて
[:find ?a . ;; mind the '.'
:in $ ?an
:where
[?a :account/name ?an]
]
:
セットまたはベクターを渡すかどうかにかかわらずエラーメッセージが同じでない場合は、エラーメッセージに「セットを渡す」と表示された場合のように、「first」を使用したときのエラーメッセージは ' t 'を渡すと、私は 'ffirst'になってしまい、この質問を全く聞く必要はありませんでした。 –
エラーメッセージを出さなかったので、最初の 'ffirst'の代わりに –
' ffirst'をうまく動作させるには、d/pullの上流で 'ffirst'を使う必要がありました。これは 'eid'がベクトルにあるので私には意味があります。 1つの実験を除いてすべての方法でコメントアウトされ、そのままになった「プル」とは関係ありません。 –