Почему Datomic дает тот же временный идентификатор дважды подряд при итерации?

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

  •  21-12-2019
  •  | 
  •  

Вопрос

Это даст два разных идентификатора, что отлично:

#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>

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top