Нет ошибки функции чтения при использовании Datomic в Light Table

Когда я оцениваю этот код в 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

Кто-нибудь знает, что происходит?


person ajsie    schedule 12.03.2013    source источник
comment
Литерал #db/id является виновником.   -  person deprecated    schedule 17.03.2013


Ответы (3)


Авторами этого руководства являются Стюарт Хэллоуэй и Бобби Колдервуд:

(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

person Khaled.K    schedule 26.03.2013

Похоже, возникла проблема с попыткой установить :person/id. После части #db/id[:db.part/user -1000001] у вас есть временный идентификатор для добавления данных.

Вы должны быть в состоянии начать устанавливать атрибуты для объекта, используя такие вещи, как :person/name name.

Если вы пытаетесь создать что-то типа "общедоступного идентификатора", этот сообщение в блоге может быть полезным.

person Tim    schedule 20.03.2013

Это проблема в 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).

person agarman    schedule 06.04.2014