Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] [Datomic] Resposta da pergunta da aula 05 - Bancos filtrados e histórico

Pessoal, fiquei com uma dúvida aqui. Na aula de "Bancos filtrados e as-of", a questão faz a seguinte pergunta:

"A vantagem de acessar qualquer momento histórico do banco é não perder nada do que aconteceu. Por outro lado sempre que temos uma conexão com o banco queremos definir qual o snapshot que queremos utilizar para fazer uma query."

E a resposta dada como correta é:

"Por padrão d/db reflete o momento atual, mas posso pedir acesso a uma query num momento específico usando o as-of."

Porém, existe a seguinte opção para ser marcada também:
"Por padrão d/db reflete o momento da conexão, mas posso pedir acesso a uma query num momento específico usando o as-of."

E rodando o código com o datomic na versão 1.0.7394, ele na verdade responde com o estado do banco na hora da conexão. Para que eu consiga os dados mais atualizados, eu precisaria realizar uma nova conexão com o banco.

Exemplo:

(ns ecommerce.core
  (:require
   [datomic.api :as d]
   [ecommerce.db :as db]
   [ecommerce.model :as model]))

(def conn (db/open-conn))

(db/cria-schema conn)

(let [pc (model/new-product "pc novo" "/pc-novo" 2500.30M)]
  (d/transact conn [pc]))

(def db (d/db conn))

; retorna um datom contendo a inserção
(let [nome "pc novo"]
  (d/q '[:find (pull ?entidade [*])
         :in $ ?nome
         :where [?entidade :produto/nome ?nome]] 
       db nome))

; inserindo um novo datom
(let [pc (model/new-product "pc novo" "/pc-novo2" 200.59M)]
  (d/transact conn [pc]))

; utilizando a mesma variável "db"
; retorna APENAS UM datom contendo a primeira inserção
(let [nome "pc novo"]
  (d/q '[:find (pull ?entidade [*])
         :in $ ?nome
         :where [?entidade :produto/nome ?nome]] 
       db nome))

; utilizando uma nova conexão
; retorna DOIS datoms contendo a segunda inserção
(let [nome "pc novo"]
  (d/q '[:find (pull ?entidade [*])
         :in $ ?nome
         :where [?entidade :produto/nome ?nome]] 
       (d/db conn) nome))

Isso modificou em versões mais atualizadas do datomic?

1 resposta
solução!

Bom dia, Mateus! Como vai?

No Datomic, a função d/db é usada para obter uma representação do banco de dados em um determinado ponto no tempo. Por padrão, d/db reflete o estado mais recente do banco de dados, ou seja, o momento atual. Isso significa que, em teoria, ele deveria sempre fornecer o estado mais atualizado do banco de dados sem a necessidade de reconectar.

No entanto, a confusão pode surgir em relação ao momento em que a conexão é feita. Quando você cria uma conexão com o banco de dados, essa conexão em si não é automaticamente atualizada com cada nova transação. Para garantir que você está vendo o estado mais recente, você deve chamar d/db novamente após cada transação ou quando quiser garantir que está trabalhando com os dados mais atualizados.

Portanto, a resposta correta na atividade é que d/db reflete o momento atual, mas você pode pedir acesso a um estado específico usando as-of. Isso não mudou nas versões mais recentes do Datomic, mas é sempre uma boa prática verificar a documentação oficial para qualquer atualização ou mudança de comportamento.

Espero ter ajudado e fico à disposição se precisar.

Abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado