Почему Datomic дает тот же временный идентификатор дважды подряд при итерации?
Вопрос
Это даст два разных идентификатора, что отлично:
#db/id[:db.part/user]
#db/id[:db.part/user]
.
Но все, что понравилось следующее (я пробовал много идей до сих пор) будет производить тот же идентификатор дважды, что не то, что я хочу:
(repeatedly 2 (fn [] #db/id[:db.part/user]))
(for [n [1 2]] #db/id[:db.part/user])
.
Все дают что-то вроде
(#db/id[:db.part/user -1000774] #db/id[:db.part/user -1000774])
.
Откуда полученный номер такой же для каждого вызова.
Что я на самом деле хочу, для звонков вообще не производить число, чтобы я мог просто добавить произведенные данные через транзакцию.
Любые идеи?
Просто чтобы быть понятным, Документация говорит: «Каждый звонок для Tempid производит уникальный временныйID. "
[отредактировано после комментариев @maxthoursie, что repeat
будет иметь эту проблему в любом случае.]
Решение
Использование
(require '[datomic.api :as d])
(repeatedly 2 #(d/tempid :db.part/user))
;; => (#db/id[:db.part/user -1000118] #db/id[:db.part/user -1000119])
.
Подумайте о том, что # ... Макрос читателя означает, что их значение будет разрешено при прочтении выражения, которое, естественно, происходит только один раз.Используйте The # ... Macro только тогда, когда вы пишете буквальные данные транзакции (как схема).Используйте datomic.api / tempid для генерации темпенов во время выполнения.
Другие советы
Потому что повторение повторяется значение, которое он получил от идентификатора вызова один раз.
использовать несколько раз.
См. Примеры на http://clojredocs.org/Clojure_core/Clojure.core/repeatedA>