clojureql,打开全局并显示结果
只是想了解clojureql的开放式全局和结果的目的。我首先阅读了以下概述: 出于某种原因,我认为open global将用connection取代sql/的功能,例如,我认为这会起作用: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
(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,谢谢你的详细回复!