Por que Datomic produzir a mesma IDENTIFICAÇÃO temporário duas vezes em uma linha quando a iteração?

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

  •  21-12-2019
  •  | 
  •  

Pergunta

Isto irá produzir dois ids diferentes, o que é ótimo:

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

mas qualquer coisa como o seguinte (eu tentei um monte de idéias até agora) irá produzir o mesmo id duas vezes, o que não é o que eu quero:

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

Todos rendimento algo como

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

onde o número produzido é o mesmo para cada chamada.

O que eu realmente desejo é que as chamadas para NÃO produzir um número em tudo, para que eu possa adicionar apenas os dados produzidos através de uma transação.

Qualquer idéias?

Apenas para ser claro, a documentação diz, "Cada chamada para tempid produz uma única identificação temporário."

[Editado depois comentário por @maxthoursie que repeat gostaria de estar tendo este tipo de problema, em qualquer caso.]

Foi útil?

Solução

Utilização

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

Considere que #...são reader macros que significa que o seu valor será resolvido quando a expressão é ler o que naturalmente acontece apenas uma vez.Use o #...macro somente quando você estiver escrevendo literal de transação de dados (como um esquema).Use datomic.api/tempid para gerar tempids em tempo de execução.

Outras dicas

Porque a repetição é a repetição do valor que ele tem de identificação de chamada uma vez.

Usar repetidamente em vez disso.

Ver exemplos em http://clojuredocs.org/clojure_core/clojure.core/repeatedly

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top