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

欢迎!请查阅关于页面了解如何使用本页面的更多信息。

0

编辑

如果没有任何转换,如何从next.jdbc/plan的结果中实现行?

直接使用(Identity)不适用

(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 []
      (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 [] ...) 递减过程中使用 (map #(rs/datafiable-row % db-spec opts))。

这似乎是文档可以改进的地方 :)
最新文档(对于 1.0.384 版本)包括有关 datafiable-row 的更多信息并包含示例。
太好了,谢谢!
...