gpt4 book ai didi

postgresql - clojure.java.jdbc 惰性查询

转载 作者:行者123 更新时间:2023-11-29 11:26:11 24 4
gpt4 key购买 nike

我有一个基本上是 select * 的查询。在开发中这个表只有 30000 行,但在生产中它会更大。所以我想懒惰地使用这个查询。为什么下面的查询不是惰性的?我正在使用 Postgres 9.5.4.1。

(do
(def pg-uri {:connection-uri "jdbc:postgresql://localhost/..."})
(def row (atom 0))
(take 10 (clojure.java.jdbc/query
pg-uri
["select * from mytable"]
{:fetch-size 10
:auto-commit false
:row-fn (fn [r] (swap! row inc))}))
@row) ;;=> 300000

最佳答案

首先,请参阅 https://jdbc.postgresql.org/documentation/83/query.html#query-with-cursor .

这样解决了。

(jdbc/with-db-transaction [tx connection]
(jdbc/query tx
[(jdbc/prepare-statement (:connection tx)
"select * from mytable"
{:fetch-size 10})]
{:result-set-fn (fn [result-set] ...)}))

其中 :result-set-fn 是一个使用惰性结果集的函数。

with-db-transaction 负责将 autoCommit 设置为 false:fetch-size 不是从 query 传递过来的,所以你必须自己做一个 prepare-statement

关于postgresql - clojure.java.jdbc 惰性查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39765943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com