请发表您的观点,参与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]]

是否存在能涵盖地图和向量行实现的转换函数?

或者我应该使用除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 页面上找不到... 对于有 3 个参数的 `plan`,不确定如何使用它。
与您调用 (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 的更多信息并提供了一个示例。
太好了,谢谢!
...