Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojureql,打开全局并显示结果_Clojure_Clojureql - Fatal编程技术网

clojureql,打开全局并显示结果

clojureql,打开全局并显示结果,clojure,clojureql,Clojure,Clojureql,只是想了解clojureql的开放式全局和结果的目的。我首先阅读了以下概述: 出于某种原因,我认为open global将用connection取代sql/的功能,例如,我认为这会起作用: (def db {...}) ; connection details omitted (open-global db) (println (:name (first @(table :users))) 然而,这不起作用。似乎我需要同时执行openglobal和将正在执行的查询包装在一个(sql/wi

只是想了解clojureql的开放式全局和结果的目的。我首先阅读了以下概述:

出于某种原因,我认为open global将用connection取代sql/的功能,例如,我认为这会起作用:

(def db {...}) ; connection details omitted
(open-global db) 

(println (:name (first @(table :users))) 
然而,这不起作用。似乎我需要同时执行openglobal和将正在执行的查询包装在一个(sql/with connection db)中,这让我有点吃惊(我认为openglobal提供了一个默认的全局可访问连接)。既然情况并非如此,我现在只想知道它到底有什么作用


另外,…with results与简单地使用@执行查询有何不同?因为@(表:用户)似乎会给我留下一个序列,这是执行查询的结果(这不也是“结果”的结果吗?

使用
deref
@
符号)与使用结果之间的区别非常微妙。基本上两者都做相同的事情,唯一的区别是查询实际执行的时刻。这两种方法实际上都只是
关系协议的
应用方法的包装,下面是
的代码和结果:

(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
查询将延迟执行,即在实际使用结果时执行查询


至于
openglobal
,您是对的,它确实应该打开一个全局可用的连接,当不使用
wiht connection
指定连接时,ClojureQL将使用该连接。您观察到的行为可能是一个bug,因此我建议您在IRC频道或Github上的ClojureQL问题跟踪程序上报告它。我已经有一段时间没有使用ClojureQL了,但看看代码,他们似乎已经过渡到使用
clojure.java.jdbc
,而不是
clojure.contrib.sql
,这里可能出了点问题。

更多信息,在测试中,我发现如果我使用结果,然后打开global works,但是如果我使用deref/@那么它需要连接(奇怪的是,还需要打开全局…)。我会查看irc,谢谢你的详细回复!