我发现在流程交易者的in(mem)和out(dev,sql ...)中处理db.type/instant
值的方式不一致。
使用in process mem transactor时,交易和检索时会保留db.type/instant
值的基础类型。例如,下面的(打字机打印机uri)显示已将交易的java.util.TimeStamp
检索为java.sql.TimeStamp
。但是,在流程外交易者中,它将被检索为java.util.Date
。
在大多数情况下,这种不一致不会导致问题,但是在处理错误的Date实现时,它可能会导致各种问题。在我的情况下java.sql.TimeStamp
没有对称的equals方法的事实意味着我的代码中的错误只出现在我在一个进程外的交易器中运行时...
显然,Datomic对java.util.Date
的外部实施没有任何控制权,所以我认为“日期排毒”#39;过程中交易者的方法是正确的。
在我把它作为Datomic人的一个问题提出来之前,我真正想要的只是一个完整性检查,所以如果有人可以看看你是否同意它会非常感激。
谢谢,
太
(require '[datomic.api :as d])
(import '(java.sql Timestamp))
(defn type-printer [uri]
"Prints the type of a transacted java.sql.TimeStamp when retrieved from the databse"
(d/create-database uri)
(let [ts-att-schema {:db/id (d/tempid :db.part/db)
:db/ident :entity/ts
:db/valueType :db.type/instant
:db/cardinality :db.cardinality/one
:db.install/_attribute :db.part/db}
ts (Timestamp. 1000000000000)
entity {:db/id (d/tempid :db.part/user)
:entity/ts ts}
conn (d/connect uri)]
;transact schema and then entity with associated TimeStamp value
@(d/transact conn [ts-att-schema])
@(d/transact conn [entity])
(let [type (->> (d/db conn)
(d/q '[:find ?ts :where[?e :entity/ts ?ts]])
(first)
(first)
(type)
)]
(println "java.sql.TimeStamp is retrived as type" type))))
;TimeStamp type is preserved when being transacted and then retrieved
(type-printer "datomic:mem://test-db")
;TimeStamp is sanitised in the database and retrieved as a java.util.Date. This case obviously relies on a
;dev transactor running on localhost:4334. Have only verified for dev and sql transactors.
(type-printer "datomic:dev://localhost:4334/test-db")