Pourquoi DateMic donne-t-il le même identifiant temporaire deux fois de suite lors de l'itération?
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.]
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>