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 个参数的arity。
正如您调用 (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 的更多信息,并有一个示例。
太好了,谢谢!
...