Clojure.contrib.sql: как мне получить результаты оператора select в вектор, к которому можно получить доступ в любое время?

#sql #clojure

#sql #clojure

Вопрос:

Например, в этом запросе:

 (Clojure.contrib.sql/with-query-results rows ["SELECT count(*) from tableName"] (doseq [record rows] (println (vals record))))
 

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

Обновление: я попробовал следующие строки кода

 (def asdf [])
(sql/with-connection db

(sql/with-query-results rows ["SELECT * FROM tableName"] (doseq [record rows] (def asdf (conj asdf record)))))

(println asdf)
 

Почему оператор печати asdf выше возвращает пустой, когда я добавил к нему строки в инструкции sql?

Ответ №1:

Похоже, вам не хватает базового понимания основополагающих принципов Clojure, в частности неизменяемых структур данных. Ваш conj вызов не изменяет var asdf — var не является переменной. Вы могли бы сделать что-то вроде следующего (непроверенного)

 (def asdf 
    (sql/with-connection db
         (doall (sql/with-query-results rows ["SELECT * FROM tableName"]))))
 

сохранить результат непосредственно как значение asdf , но это, вероятно, не совсем то, что вы хотите. Вместо этого ознакомьтесь с подходом Clojure к функциональному программированию.