用于Datomic的事务处理API

时间:2018-11-04 08:37:47

标签: clojure datomic

肯定是一个愚蠢的问题,但希望应该将其清除。

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

user=> (d/transact conn {:tx-data movie-schema})

但是,当我尝试此操作时,我会得到

ClassCastException clojure.lang.PersistentArrayMap cannot be cast to java.util.List  datomic.api/transact 

相反,当我刚做

(d/transact conn schema)

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

编辑:这篇文章的初始版本提到了架构,但通常也是如此,仅添加新事实也是如此(即,使用{:tx-data foo}无效,而仅使用{ {1}}确实如此。

2 个答案:

答案 0 :(得分:1)

您可以在此处查看有效的演示:https://github.com/cloojure/tupelo-datomic

只需克隆存储库并运行测试:

~/tupelo-datomic > lein test

lein test tst.tupelo-datomic._bootstrap

----------------------------------
   Clojure 1.9.0    Java 10.0.1
----------------------------------

lein test tst.tupelo-datomic.bond

lein test tst.tupelo-datomic.bond-query

lein test tst.tupelo-datomic.core

lein test tst.tupelo-datomic.find

lein test tst.tupelo-datomic.functionality

lein test tst.tupelo-datomic.quick-start
:using-local

Ran 17 tests containing 110 assertions.
0 failures, 0 errors.
~/tupelo-datomic > 

关于您的特定问题,我仅将:tx-data用作Datomic操作的 输出 的字段。我从未将其用作 input 数据中的字段。您引用的文档可能不正确或已过时。

这里是一个例子(注意用括号代替花括号):

https://github.com/cloojure/tupelo-datomic/blob/master/src/tupelo_datomic/core.clj#L540


有关更多详细信息,您可以在单元测试https://github.com/cloojure/tupelo-datomic/blob/master/test/tst/tupelo_datomic/core.clj#L46

中看到本地Datomic函数调用作为包装函数new-attribute的输出。
  (let [result (td/new-attribute
                 :weapon/type :db.type/keyword
                 :db.unique/value :db.unique/identity :db.cardinality/one :db.cardinality/many
                 :db/index :db/fulltext :db/isComponent :db/noHistory)]
    (is (s/validate datomic.db.DbId (:db/id result)))
    (is (wild-match? {:db/id          :* 
                      :db/ident       :weapon/type
                      :db/index       true 
                      :db/unique      :db.unique/identity
                      :db/noHistory   true
                      :db/cardinality :db.cardinality/many
                      :db/isComponent true
                      :db.install/_attribute :db.part/db
                      :db/fulltext    true 
                      :db/valueType   :db.type/keyword}
          result)))

答案 1 :(得分:1)

我认为您遇到问题的原因是Peer APItransact接受列表)和Client APItransact接受包含:tx-data键的地图)。我怀疑您试图在对等进程的REPL中运行REPL命令,而链接到tutorialexpects在客户端进程的REPL中运行命令。

为什么对等方和客户之间不一致?我不是Datomic团队的一员,只能推测:

  1. Peer API以前是在Client API之前设计的,那时“事务请求作为列表”格式已经足够
  2. 在设计客户端API时,由于调用d/transact的代价更高(我相信它会导致从客户端到服务器的额外I / O往返),因此作者为事务请求中的其他数据留出了余地(例如用于模板制作),因此是基于地图的可扩展格式。