2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面以了解更多此功能的信息。

0
Libs
编辑

如何从next.jdbc/plan的结果直接实现行,不进行任何转换?

标识符不适用

(require '[next.jdbc :as jdbc])

(def sql-params
  ["SELECT column1
      FROM (VALUES (1, 1, 1),
                   (2, 2, 2),
                   (3, 3, 3)) AS _"])

(into []
      (map identity)
      (jdbc/plan db-spec
                 sql-params))
;=> [{row} from `plan` -- missing `map` or `reduce`?
;    {row} from `plan` -- missing `map` or `reduce`?
;    {row} from `plan` -- missing `map` or `reduce`?]

如果行以映射(默认)的形式表示,则#(into {} %)适用

(into []
      (map #(into {} %))
      (jdbc/plan db-spec
                 sql-params))
;=> [{:column1 1} {:column1 2} {:column1 3}]

如果行以向量(builder-fn)的形式表示,可以使用vec

(require '[next.jdbc.result-set :as rs])

(into []
      (map vec)
      (jdbc/plan db-spec
                 sql-params
                 {:builder-fn rs/as-arrays}))
;=> [[1] [2] [3]]

有任何xform可以同时包含映射和向量的行实现吗?

或者我应该使用除plan之外的东西进行懒加载的结果集读取?

1 答案

+1

选定
 
最佳答案

如果您只想将整个结果集作为哈希表数组,请使用execute!

如果您需要从数据库懒加载(大型)结果集,则必须使用plan

如果您希望当plan减值时行是实际的哈希表,您有两个选择

  1. 对每一行调用 rs/datafiable-row 以完全将这行实现为 Clojure 数据,然后进行处理。
  2. 对每一行使用所需列的列表,调用 select-keys

如果你对行执行任何需要将其实现为 Clojure 数据结构的操作,那么将自动调用 rs/datafiable-row。`(keys row)` 将幕后调用 `seq`,这将强制完全实现。

select-keys不会 实现行,因为可以直接从底层的 `ResultSet` 获取单个条目(由于 `ResultSet` 被包装在 `Associative` 中,所以调用了 `.entryAt`)。你也可以通过名称无实现整个行来获取单个列(`(:col row)` 或 `(get row :row)` 都可以工作)。

Home by
请提供使用 `rs/datafiable-row` 的代码示例?我在 github 页面上找不到……不确定如何与 `plan` 配合使用,因为它有 3 个参数的参数。
评论 by Sean Corfield
与调用(jdbc/plan connectable sql-params opts)一样,调用(rs/datafiable-row row connectable opts)。

因此,你将我们在(into [] ...)归约中使用(map #(rs/datafiable-row % db-spec opts))。

这似乎是一个文档可以改进的区域 :)
Home by
最新文档(针对 1.0.384 版本)包含有关 datafiable-row 的更多信息,并有一个示例。
评论 by Nikola Vojičić
太好了,谢谢!
...