2024 年 Clojure 状态调查中分享你的想法!

欢迎!请参阅关于页面了解更多有关此功能的信息。

0

编辑

如何从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) 都可以工作)。

您能否提供一个使用 `rs/datafiable-row` 的代码示例?我在 github 页面上找不到它... 不确定如何与 `plan` 一起使用,因为后者有 3 个参数。
正如您调用 (jdbc/plan connectable sql-params opts) 一样,您调用 (rs/datafiable-row row connectable opts)

因此,在您的 (into [] ...) 减少Styled Span(reduce) 中)使用 (map #(rs/datafiable-row % db-spec opts))

这似乎是一个可以改进文档的领域 :)
最新的文档(针对 1.0.384 发行版)包含有关 datafiable-row 的更多信息,并有一个示例。
太好了,谢谢!
...