Datomic 的交易 API

aga*_*gam 8 clojure datomic

当然是一个愚蠢的问题,但希望应该能解决问题。

我正在关注https://docs.datomic.com/on-prem/getting-started/transact-schema.html,并且在本教程中处理架构的步骤是

user=> (d/transact conn {:tx-data movie-schema})
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试这个时,我得到

ClassCastException clojure.lang.PersistentArrayMap cannot be cast to java.util.List  datomic.api/transact 
Run Code Online (Sandbox Code Playgroud)

相反,当我只是做

(d/transact conn schema)
Run Code Online (Sandbox Code Playgroud)

这个对我有用。教程在这里是否缺少一些微妙之处?我错过了什么吗?(唯一的区别是我使用的是免费版而不是 Starter Pro 版)。

编辑:这篇文章的初始版本提到了模式,但这通常也适用于仅添加新事实(即使用{:tx-data foo}不起作用,但仅使用有效foo)。

Val*_*nck 4

我认为您的问题的原因是Peer API(其中transact接受列表)和Client API(其中transact接受包含密钥的映射:tx-data)之间的不一致。我怀疑您尝试在对等进程的 REPL 中运行 REPL 命令,而您链接到的教程希望您在客户端进程的 REPL 中运行命令。

为什么同行和客户之间不一致?由于不是 Datomic 团队的一员,我只能推测:

  1. Peer API 历史上是在 Client API 之前设计的,当时“交易请求列表”格式就足够了
  2. 当设计客户端 API 时,由于调用成本更高d/transact(我相信它会产生从客户端到服务器的额外 I/O 往返),作者为事务请求中的附加数据留出了空间(例如用于模板),因此更具可扩展性的基于地图的格式。