Clojure JDBC - этот ResultSet закрыт - PullRequest
0 голосов
/ 01 ноября 2018

В настоящее время я учусь использовать Clojure и соединение с postgresql, и я застрял. В моем коде я могу успешно запросить, используя SELECT, используя java.jdbc зависимость, но получил исключение, когда я UPDATE или INSERT

Я использую эти зависимости

[org.clojure/java.jdbc "0.7.8"]
[postgresql "9.3-1102.jdbc41"]

Это мой рабочий код для SELECT -ing из таблицы с именем public."user"

(ns knp-api.model.user
  (:require [clojure.java.jdbc :as sql]))


(def db "jdbc:postgresql://ampersanda@localhost:5432/idjoesoft_klinik")

(defn get-count [q]
  "Get count key from query
   It takes jdbc.query as parameter"
  (:count (first (into [] q))))

(defn is-user-email-available? [e]
  "Returns boolean when email is available.
   Take one parameter, it's email"
  (let [q "SELECT COUNT(*) FROM public.\"user\" t WHERE user_email = ?"]
    (sql/query db [q e] {:result-set-fn #(= 1 (get-count %))})))

и это не мой код, из-за которого появляется исключение

(defn set-user-timestamp-and-token [email token timestamp]
  "update user current token and last login time inside database.
   Takes email, token, and current timestamp as parameter"
  (sql/update! db 
               "public.\"user\"" 
               {:user_last_login (str "to_timestamp(" timestamp ")") 
                :user_token token}  
               ["user_email = ?" email]))

и это исключение

enter image description here

UPDATE

Я также пытаюсь использовать REPL для создания таблицы, и я также получаю те же результаты.

knp-api.handler=> (require '[clojure.java.jdbc :as sql])
nil
knp-api.handler=> (sql/db-do-commands "jdbc:postgresql://ampersanda@localhost:5432/idjoesoft_klinik" (sql/create-table-ddl :testing [[:data :text]]))

PSQLException This ResultSet is closed.  org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkClosed (AbstractJdbc2ResultSet.java:2852)

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Я помню эту проблему, но это было много лет назад, и я не могу вспомнить решение. Однако, обёртывание сырого JDBC в Clojure не очень хорошая идея. Существует ряд превосходных библиотек Clojure, которые значительно облегчают работу с базами данных. Я бы особенно рекомендовал SQL Korma и Hug SQL .

0 голосов
/ 01 ноября 2018

Я подозреваю, что обновление происходит нормально, а затем он пытается вернуть измененные строки и пытается сделать это как ленивая последовательность. вещь, которая пытается распечатать / обработать эту ленивую последовательность результатов, может делать это после того, как соединение закрыто.

попробуйте заключить оператор select в вызове в doall, чтобы убедиться, что он читается немедленно и не может быть отложенной базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...