Разница между использованием deref
(символ @
) и результатами со-довольно тонкая. В основном оба делают одно и то же, единственное различие заключается в том, в какой момент запрос фактически выполняется. На самом деле оба являются обертками для метода apply-on
протокола Relation
, вот код для with-results
:
(defmacro with-results
[[results tble] & body]
`(apply-on ~tble (fn [~results] ~@body)))
А для deref
:
(deref [this]
(apply-on this doall))
Как видите, deref
точно так же, как:
(with-results [res (table :users)] (doall res))
Если вы посмотрите документацию doall
, вы увидите, что это функция, используемая для обхода ленивой последовательности, чтобы вызвать любой побочный эффект, в результате чего последовательность будет полностью оценена, и, следовательно, не будет ленивый, но находящийся в памяти.
Таким образом, чтобы дать вам более простое объяснение, использование deref
фактически выполняет запрос в тот момент, когда он вызывается, тогда как with-results
запрос будет выполняться лениво, то есть когда результат фактически потребляется.
Что касается open-global
, вы были правы в этом, оно действительно должно открыть глобально доступное соединение, которое будет использоваться ClojureQL, если не указать одно с помощью wiht-connection
. Поведение, которое вы наблюдаете, вероятно, является ошибкой, поэтому я предлагаю вам сообщить об этом на IRC-канале или на трекер проблем ClojureQL на Github. Некоторое время я не использовал ClojureQL, но, глядя на код, они, похоже, перешли на использование clojure.java.jdbc
вместо clojure.contrib.sql
, возможно, что-то там пошло не так.