请分享您的想法,参加Clojure 2024状态调查!

欢迎!请参阅关于页面了解更多关于这个网站如何运作的信息。

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`?]

如果行以映射形式表示(默认),可以使用(code)#(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之外的lazy结果集读取方式?

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 的更多信息和示例。
发帖人:
太好了,谢谢!
...