"No reader function" error using Datomic in Light Table
Asked Answered
P

3

8

When I eval this code in 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}]))

I get:

clojure.lang.ExceptionInfo: No reader function for tag id
core.clj:4327 clojure.core/ex-info

Anyone knows what is going on?

Plexor answered 12/3, 2013 at 22:26 Comment(1)
The #db/id literal is the culprit.Shopkeeper
K
2

This tutorial is attributed to stuart halloway and 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)

Source: https://github.com/Datomic/day-of-datomic/blob/master/samples/literals_vs_code.clj

Kathrynekathy answered 26/3, 2013 at 16:27 Comment(0)
V
0

It looks like there's an issue with trying to set :person/id. After the #db/id[:db.part/user -1000001] part, you've got a temporary id for adding data.

You should be able to start setting attributes for the entity using things like things like :person/name name.

If you're trying to create a "public id" type of thing, this blog post may be helpful.

Vosges answered 20/3, 2013 at 15:24 Comment(0)
R
0

It's a problem in nREPL. The way I solved this is to start the REPL at the command line with:

lein repl

This will start a process that you can connect to from LightTable or Emacs. It will print information like:

nREPL server started on port 51395 on host 127.0.0.1
                             ^^^^^

Now in LightTable, Add a Connection -> Clojure Remote -> 127.0.0.1:XXXXX

The XXXXX should equal the port printed out by lein repl.

If you're in Emacs, cider has the same issue. Follow the same steps of starting lein repl, then use M-x cider-connect (it's default keybinding is C-c M-c).

Ramification answered 6/4, 2014 at 14:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.