12

datomic でトランザクションを実行して値を挿入した後、トランザクションの戻り値を使用して、作成されたエンティティの ID を取得するにはどうすればよいですか?

挿入後に取得する戻り値のサンプルを次に示します。

#<promise$settable_future$reify__4841@7c92b2e9: {:db-before datomic.db.Db@62d0401f, :db-after datomic.db.Db@bba61dfc,
 :tx-data [#Datum{:e 13194139534331 :a 50 
:v #inst "2013-06-19T11:38:08.025-00:00" 
:tx 13194139534331 :added true} #Datum{:e 17592186045436 .....

基礎となるデータムを見ることができます...どうすればそれらの値を抽出できますか?

4

4 に答える 4

12

d/resolve-tempidを使用します。単一のエンティティをトランザクションする場合は、 を見て:tx-data も問題ありませんが、トランザクションに複数のエンティティが含まれている場合は、それらが に表示される順序がわからないでしょう:tx-data

あなたがすべきことは、エンティティに一時的なIDを(取引する前に)(d/tempid)またはそのリテラル表現#db/id[:db.part/user _negativeId_]を使用d/resolve-tempidして与え、一時的なIDからデータベースによって与えられた実際のIDに移動するために使用することです。コードは次のようになります。

(d/resolve-tempid (d/db conn) (:tempids tx) (d/tempid :db.part/user _negativeId_))

完全なコード サンプルについては、この要点を参照してください。

于 2013-06-19T13:39:29.747 に答える
7

あ、わかった。

Clojure の promise を逆参照する必要がありましたが、必要な値を取り出すことができました。

 (:e (second (:tx-data @(transact! conn query))))
于 2013-06-19T12:14:23.837 に答える
1

a2ndradeの回答に基づいて簡単な関数を作成しました。ネーミングは理想的ではなく、慣用的な失敗を犯している可能性があります。提案は大歓迎です。

(ns my.datomic.util
  (:require [datomic.api :as d]))

(defn transact-and-get-id
  "Transact tx and return entity id."
  [conn tx]
  (let [tempid (:db/id tx)
        post-tx @(d/transact conn [tx])
        db (:db-after post-tx)
        entid (d/resolve-tempid db (:tempids post-tx) tempid)]
    entid))

使用例:

(def my-conn
  (d/connect (str "datomic:sql://datomic?jdbc:postgresql://"
                  "127.0.1:5432/datomic?user=datomic&password=somepw")

(defn thing-tx
  "Create transaction for new thing."
  [name]
  {:db/id (d/tempid :db.part/user)
   :thing/name name})

(transact-and-get-id my-conn (thing-tx "Bob")) ;; => 17592186045502
于 2015-03-08T07:51:41.033 に答える
0

Tupelo Datomic ライブラリ(td/eids tx-result)には、トランザクションで作成された EID を簡単に抽出する機能があります。例えば:

  ; Create Honey Rider and add her to the :people partition
  (let [tx-result   @(td/transact *conn* 
                        (td/new-entity :people ; <- partition is first arg (optional) to td/new-entity 
                          { :person/name "Honey Rider" :location "Caribbean" :weapon/type #{:weapon/knife} } ))
        [honey-eid]  (td/eids tx-result)  ; retrieve Honey Rider's EID from the seq (destructuring)
  ]
于 2015-09-02T18:03:40.183 に答える