Perché DutOMIC produce lo stesso ID temporaneo due volte di seguito quando Iterating?
Domanda
Questo produrrà due ID diversi, che è ottimo:
#db/id[:db.part/user]
#db/id[:db.part/user]
.
Ma tutto come il seguente (ho provato un sacco di idee finora) produrrà lo stesso ID due volte, che non è quello che voglio:
(repeatedly 2 (fn [] #db/id[:db.part/user]))
(for [n [1 2]] #db/id[:db.part/user])
.
Tutti producono qualcosa come
(#db/id[:db.part/user -1000774] #db/id[:db.part/user -1000774])
.
Dove il numero prodotto è lo stesso per ogni chiamata.
Quello che voglio effettivamente è che le chiamate non producano un numero, in modo da poter solo aggiungere i dati prodotti tramite una transazione.
Qualche idea?
solo per essere chiaro, La documentazione dice ", ogni chiamata a tempid produce un temporaneo unicoID. "
[Modificato dopo il commento di @maxthoursie che repeat
avrebbe avuto questo problema in ogni caso.]
Soluzione
Usa
(require '[datomic.api :as d])
(repeatedly 2 #(d/tempid :db.part/user))
;; => (#db/id[:db.part/user -1000118] #db/id[:db.part/user -1000119])
.
Considera che # ... sono macro di lettore, il che significa che il loro valore verrà risolto quando viene letta l'espressione che accade naturalmente solo una volta.Utilizzare il # ... Macro solo quando scrivi dati di transazione letterali (come uno schema).Utilizzare DATOMIC.API / TEMPID per generare tempids in runtime.
Altri suggerimenti
Poiché la ripetizione sta ripetendo il valore ottenuto dall'ID chiamando una volta.
Utilizzare ripetutamente invece.
Vedi esempi a http://clojuredocs.org/clojure_core/clojure.core/repeatedlyjex/A>