2017-02-17 21 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"])))) 

(Нет петли на всех.)

 Смежные вопросы

  • Нет связанных вопросов^_^