当我在lighttable中评估此代码时:
(ns app.core
(:require [datomic.api :refer [q] :as d]
:reload-all))
(defn add-person
[conn id]
(d/transact conn [{:db/id #db/id[:db.part/user -1000001]
:person/id id}]))
我明白了:
clojure.lang.ExceptionInfo: No reader function for tag id
core.clj:4327 clojure.core/ex-info
任何人都知道发生了什么事?
答案 0 :(得分:2)
本教程归功于stuart halloway和Bobby Calderwood:
(use :reload 'datomic.samples.repl)
(easy!)
(def conn (scratch-conn))
;; in data, use data literals for tempids
(def tx-data [{:db/id #db/id[:db.part/user]
:db/doc "Example 1"}])
(transact conn tx-data)
;; in code, call tempid to create tempids
(let [id (tempid :db.part/user)
doc "Example 2"]
(transact conn [{:db/id id :db/doc doc}]))
;; same argument applies to functions:
;; use #db/fn literals in data
;; use Peer.function or d/function in code
;; broken, uses db/fn literal in code
(transact conn [{:db/id #db/id [:db.part/user]
:db/ident :hello
:db/fn #db/fn {:lang "clojure"
:params []
:code '(println :hello)}}])
;; corrected: used d/function to construct function
(transact conn [{:db/id (d/tempid :db.part/user)
:db/ident :hello
:db/fn (d/function {:lang "clojure"
:params []
:code '(println :hello)})}])
(d/invoke (db conn) :hello)
来源:https://github.com/Datomic/day-of-datomic/blob/master/samples/literals_vs_code.clj
答案 1 :(得分:0)
尝试设置:person/id
时似乎存在问题。在#db/id[:db.part/user -1000001]
部分之后,您有一个用于添加数据的临时ID。
您应该能够使用诸如:person/name name
之类的内容开始为实体设置属性。
如果您尝试创建“公共ID”类型的内容,则此blog post可能会有所帮助。
答案 2 :(得分:0)
这是nREPL中的一个问题。我解决这个问题的方法是在命令行启动REPL:
lein repl
这将启动一个可以从LightTable或Emacs连接的进程。它将打印如下信息:
nREPL server started on port 51395 on host 127.0.0.1
^^^^^
现在在LightTable中,添加一个连接 - > Clojure Remote - > 127.0.0.1:XXXXX
XXXXX应该等于lein repl打印出的端口。
如果你在Emacs,苹果酒有同样的问题。按照启动lein repl的相同步骤,然后使用M-x cider-connect(它的默认键绑定是C-c M-c)。