肯定是一个愚蠢的问题,但希望应该将其清除。
我遵循的是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}}确实如此。
答案 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 API(transact
接受列表)和Client API(transact
接受包含:tx-data
键的地图)。我怀疑您试图在对等进程的REPL中运行REPL命令,而链接到tutorial的expects在客户端进程的REPL中运行命令。
为什么对等方和客户之间不一致?我不是Datomic团队的一员,只能推测:
d/transact
的代价更高(我相信它会导致从客户端到服务器的额外I / O往返),因此作者为事务请求中的其他数据留出了余地(例如用于模板制作),因此是基于地图的可扩展格式。