Warum liefert Datomic beim Iterieren zweimal hintereinander dieselbe temporäre ID?

StackOverflow https://stackoverflow.com//questions/20015996

  •  21-12-2019
  •  | 
  •  

Frage

Dadurch werden zwei verschiedene IDs erzeugt, was großartig ist:

#db/id[:db.part/user]
#db/id[:db.part/user]

aber so etwas wie das Folgende (ich habe bisher viele Ideen ausprobiert) wird zweimal dieselbe ID erzeugen, was nicht das ist, was ich will:

(repeatedly 2 (fn [] #db/id[:db.part/user]))
(for [n [1 2]] #db/id[:db.part/user])

Alle ergeben so etwas wie

(#db/id[:db.part/user -1000774] #db/id[:db.part/user -1000774])

wobei die erzeugte Nummer bei jedem Anruf dieselbe ist.

Was ich eigentlich möchte, ist, dass die Anrufe überhaupt KEINE Nummer erzeugen, sodass ich die erzeugten Daten einfach über eine Transaktion hinzufügen kann.

Irgendwelche Ideen?

Nur um das klar zu stellen, die Dokumentation sagt: „Jeder Aufruf von tempid erzeugt eine eindeutige temporäre ID.“

[Bearbeitet nach dem Kommentar von @maxthoursie repeat hätte dieses Problem auf jeden Fall.]

War es hilfreich?

Lösung

Verwenden

(require '[datomic.api :as d])
(repeatedly 2 #(d/tempid :db.part/user))
;; => (#db/id[:db.part/user -1000118] #db/id[:db.part/user -1000119])

Berücksichtige das #...sind Reader-Makros, was bedeutet, dass ihr Wert aufgelöst wird, wenn der Ausdruck gelesen wird, was natürlich nur einmal vorkommt.Verwenden Sie das #...Makro nur, wenn Sie literale Transaktionsdaten schreiben (wie ein Schema).Verwenden Sie datomic.api/tempid, um Tempids zur Laufzeit zu generieren.

Andere Tipps

Denn bei „repeat“ wird der Wert wiederholt, den es durch den einmaligen Aufruf von „id“ erhalten hat.

Stattdessen wiederholt verwenden.

Beispiele finden Sie unter http://clojuredocs.org/clojure_core/clojure.core/repeatedly

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top