gpt4 book ai didi

clojureql,开放全局和结果

转载 作者:行者123 更新时间:2023-12-02 12:10:17 24 4
gpt4 key购买 nike

只是想了解 clojureql 开放全局和结果的目的。我首先阅读了此概述:How does ClojureQL compare to clojure.contrib.sql?

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

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

(println (:name (first @(table :users)))

但是这不起作用。看来我需要同时执行 open-global 并将执行查询包装在 (sql/with-connection db) 中,这让我感到惊讶(我认为 open-global 提供了默认的全局可访问连接)。因此,由于情况似乎并非如此,我现在想知道它到底做了什么。

此外...with-results 与简单地使用 @ 执行查询有何不同?因为 @(table :users) 似乎会给我留下一个执行查询结果的序列(这不是 with-results 所做的)?

最佳答案

使用 deref(@ 符号)与 with-results 之间的区别非常微妙。基本上两者都做同样的事情,唯一的区别在于实际执行查询的时刻。两者实际上都只是 Relation 协议(protocol)的 apply-on 方法的包装,这是 with-results 的代码:

(defmacro with-results
[[results tble] & body]
`(apply-on ~tble (fn [~results] ~@body)))

对于取消引用:

(deref [this]
(apply-on this doall))

如您所见,deref 与以下内容完全相同:

(with-results [res (table :users)] (doall res))

如果您查看 doall 文档,您会发现它是一个用于遍历惰性序列以强制产生任何副作用的函数,结果是该序列将完全被评估,因此不再偷懒,而是驻留在内存中。

因此,为了给您一个更实际的解释,使用 deref 实际上在调用查询时执行查询,而使用 with-results 查询将是延迟执行,即实际消耗结果时。

至于open-global,你是对的,它确实应该打开一个全局可用的连接,当未使用with-connection指定连接时,ClojureQL将使用该连接>。您观察到的行为可能是一个错误,因此我建议您在 IRC channel 或 Github 上的 ClojureQL 问题跟踪器上报告它。我有一段时间没有使用 ClojureQL,但看看代码,他们似乎已经过渡到使用 clojure.java.jdbc 而不是 clojure.contrib.sql,有些东西那里可能出了问题。

关于clojureql,开放全局和结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7178295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com