Pourquoi DateMic donne-t-il le même identifiant temporaire deux fois de suite lors de l'itération?

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

  •  21-12-2019
  •  | 
  •  

Question

Cela produira deux identifiants différents, ce qui est génial:

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

Mais quelque chose comme ce qui suit (j'ai essayé beaucoup d'idées jusqu'à présent) produira le même identifiant deux fois, ce qui n'est pas ce que je veux:

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

Tous donner quelque chose comme

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

où le nombre produit est le même pour chaque appel.

Qu'est-ce que je veux réellement, c'est que les appels ne produisent pas de numéro de tout le tout, afin que je puisse simplement ajouter les données produites via une transaction.

Des idées?

juste pour être clair, La documentation dit: "Chaque appel à TEMPID produit une temporaire uniqueid. "

[édité après commentaire de @maxthoursie que repeat aurait ce problème dans tout cas.]

Était-ce utile?

La solution

utiliser

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

considère que # ... sont des macros de lecture signifiant que leur valeur sera résolue lorsque l'expression est lue qui se produit naturellement une fois.Utilisez le # ... Macro uniquement lorsque vous écrivez des données de transaction littérales (comme un schéma).Utilisez DATOMIC.API / TEMPID pour générer des températures à l'exécution.

Autres conseils

Parce que la répétition répète la valeur issue de l'ID appelant une fois.

Utilisez à plusieurs reprises à la place.

Voir des exemples à http://clojureocs.org/clojure_core/clojure.core/repeatefy/Repeatefy/Répea>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top