- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
只是想了解 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/
只是想了解 clojureql 开放全局和结果的目的。我首先阅读了此概述:How does ClojureQL compare to clojure.contrib.sql? 出于某种原因,我认为 o
我需要生成以下内容: (clojureql.core/join (clojureql.core/table db :tableA) (clojureql.core/table db :tableA)
使用任何 clojure 数据库/orm 库,如何在数据库中创建索引?我似乎找不到任何相关的例子。 (我对 ClojureQL 和 clojure.java.jdbc 最感兴趣,因为我目前正在使用它们
看起来每一个都涵盖了基本情况,比如选择某些列和按谓词过滤非常好,但我想知道每个情况如何比较更高级的情况。在一个相对于另一个中表达复杂的查询是否更容易?一个库是否缺少另一个库所涵盖的任何功能? 最佳答案
如何从 clojureql 查询 postgres Point 类型?我希望使用 PostGIS 功能,但 clojureql 似乎不包含此功能。 最佳答案 我不是 clojureql 的专家,但如果
有没有办法只从 ClojureQL 的 disj 生成 sql 查询!连接!和更新!函数,而不是直接执行它们? 最佳答案 不,这些方法是直接执行各自准备好的语句。它们都很基础。对于 conj!和 up
我是一名优秀的程序员,十分优秀!