Как получить подробности/сообщения об ошибках из транзакции Datomic

Используя «load-data» ниже из реплики Clojure (используя «util.clj» из учебника https://github.com/swannodette/om/wiki/Intermediate-Tutorial с измененной схемой и исходным набором данных) для загрузки данных в новую базу данных Datomic данные не отображаются в консоли Datomic.

Однако я не получаю сообщения об ошибке при выполнении действия «загрузить данные» из файла repl.

Схема отображается, как и ожидалось, в консоли Datomic. Используя немодифицированный код из учебника, я могу видеть и схему, и данные.

У меня должна быть проблема в коде, который устанавливает начальные данные. Но я не знаю, где это, так как нет сообщения об ошибке.

Как я могу получить сообщения об ошибках и другую информацию из транзакции инициализации в базе данных Datomic?

Код:

(defn transact-all [conn f]
  (doseq [txd (read-all f)]
    (d/transact conn txd))
  :done)

(defn load-schema []
  (transact-all (get-conn) (io/resource "data/schema.edn")))

(defn load-data []
  (transact-all (get-conn) (io/resource "data/initial.edn")))

;; Logging provides some comparison with the known working scenario, but so far I only can log entity id's:

(defn read-log []
  (d/q '[:find ?e
         :in ?log ?t1 ?t2
         :where [(tx-ids ?log ?t1 ?t2) [?tx ...]]
         [(tx-data ?log ?tx) [[?e]]]]
       (d/log (get-conn)) #inst "2014-07-14" #inst "2015-07-01")
)

person christopherbalz    schedule 16.07.2014    source источник


Ответы (1)


В Clojure вы можете использовать @ или deref для получения результатов транзакции, например:

@(d/transact conn txd)

Карта, которую он возвращает, описана в документации для d/transact: http://docs.datomic.com/clojure/#datomic.api/transact

См., в частности:

Если транзакция прерывается, попытки получить будущее значение вызывают исключение java.util.concurrent.ExecutionException, заключающее в себе java.lang.Error, содержащую информацию об ошибке. Если транзакция истечет, вызов самой транзакции вызовет исключение RuntimeException. Время ожидания транзакции можно установить с помощью системного свойства datomic.txTimeoutMsec, по умолчанию оно равно 10000 (10 секунд).

Недопустимые транзакции также вызовут исключение IllegalArgumentException (или другое исключение).

person Ben Kamphaus    schedule 17.07.2014
comment
Пытаясь сбросить вывод, я попробовал это, но не получил вывода при выполнении из repl (кроме ':done') - это просто неправильный синтаксис? - person christopherbalz; 17.07.2014
comment
(повторите приведенный выше комментарий): пытаясь сбросить вывод, я попробовал это, но не получил вывода при выполнении из repl (кроме ':done') - это просто неправильный синтаксис? Я попробовал `(println @(d/transact conn txd)))` - person christopherbalz; 17.07.2014
comment
Я был в неправильном каталоге, поэтому у меня была неправильная версия: переключившись на правильный каталог, я вижу, что это работает отлично; Я получил свой IllegalArgumentExceptionInfo :db.error/not-a-db-id Invalid db/id: #db/id[:db.part/stage -900] datomic.error/arg (error.clj:55) . - person christopherbalz; 17.07.2014