postgresql jdbc clojure

postgresql - clojure.java.jdbc consulta diferida



(2)

Primero, vea https://jdbc.postgresql.org/documentation/83/query.html#query-with-cursor .

Lo resolvió así.

(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] ...)}))

donde :result-set-fn es una función que consume el conjunto de resultados flojos.

with-db-transaction se ocupa de autoCommit establecido en false . :fetch-size no se pasa de la query por lo que debe hacer una prepare-statement usted mismo.

Tengo una consulta que es básicamente una select * . En desarrollo, esta tabla solo tiene 30000 filas, pero en producción será mucho más grande. Entonces quiero consumir esta consulta perezosamente. ¿Por qué la consulta de abajo no es floja? Estoy usando 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


No necesita la transacción y las instrucciones preparadas anteriormente. Es el uso de :result-set-fn que hace que se consuma la secuencia diferida. Puede que tengas la intención de usar :row-fn lugar.

Para más detalles , consulte el libro de cocina Clojure. Una versión impresa también está disponible, que recomiendo.

La función jdbc / query tiene varios parámetros de palabras clave opcionales que controlan cómo se construye el conjunto de resultados devuelto. El parámetro: result-set-fn especifica una función que se aplica a todo el conjunto de resultados (una secuencia diferida) antes de que se devuelva. El argumento predeterminado es la función doall:

(defn hi-lo [rs] [(first rs) (last rs)]) ;; Find the highest- and lowest-cost fruits (jdbc/query db-spec ["select * from fruit order by cost desc"] :result-set-fn hi-lo) ;; -> [{:grade nil, :unit nil, :cost 77, :appearance nil, :name "Kumquat"} ;; {:grade 1.4, :unit nil, :cost 10, :appearance "rotten", :name "Tomato"}]

El parámetro: row-fn especifica una función que se aplica a cada fila de resultados a medida que se construye el resultado. El argumento predeterminado es la función de identidad:

(defn add-tax [row] (assoc row :tax (* 0.08 (row :cost)))) (jdbc/query db-spec ["select name,cost from fruit where cost = 12"] :row-fn add-tax) ;; -> ({:tax 0.96, :cost 12, :name "Plum"} {:tax 0.96, :cost 12, :name "Fig"})