2017-02-17 36 views
1

我剛剛開始使用Clojure,使用Heroku,第一次讀數爲this introduction。 現在處於弄髒我的手的階段,我正面臨着這個問題處理循環中的數據庫。使用Clojure在數據庫上循環使用

這是工作:

(for 
    [s (db/query (env :database-url) 
        ["select * from My_List"])] 
     ; here one can do something with s, for example: 
     ; print out (:field s) 
) 

但它是不夠的,因爲我想更新的循環中的變量。 閱讀這個主題,我明白Clojure有自己的處理變量的方式,我需要使用循環模式。

這裏是我的嘗試:

(loop [a 0 b 1 
     s (db/query (env :database-url) 
       ["select * from My_List"])] 
     ; here I want to do something with s, for example 
     ; print out (:field s) 
     ; and do the following ... but it does not work! 
    (if (> (:otherField s) 5) 
    (:otherField s) 
    (recur (+ a (:otherField s)) b s)) 
) 

因爲我試圖寫這篇文章之前做的各種方式,我知道,所不同的是事實,我做的關於數據庫的一些錯誤作品的代碼。

所以這裏來了我的問題:我需要改變什麼才能使它工作?

回答

6

我明白,當你習慣了不同的範式時,很難首先進入功能性思維。

我不認爲有關於「如何正確執行此循環」的正確解釋,因爲在此處執行循環是不正確的。

的兩件事情,感到最不正確對我說:

  1. 決不做一個SELECT * FROM table。這不是關係數據庫如何使用的。例如,當你想要的所有值之和大於5,你應該做的:SELECT SUM(field) FROM my_list WHERE field > 5

  2. 不要以爲在環(怎麼辦呢),但在你想要做與數據內容:

    • 我想在野外工作:otherFIeld
    • 我只比5
    • 更大的價值興趣我希望所有剩餘值的總和

然後你來是這樣的:

(reduce + 
     (filter #(> % 5) 
       (map :otherField 
        (db/query (env :database-url) ["select * from My_List"])))) 

(無環的。)