【问题标题】:Looping on a database with Clojure使用 Clojure 在数据库上循环
【发布时间】:2017-07-06 13:43:20
【问题描述】:

我刚开始在Heroku 上使用Clojure,初读this introduction。 现在在弄脏我的手的阶段,我面临着处理循环数据库的问题。

这是有效的:

(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))
)

由于在写这篇文章之前我尝试了各种方法,我知道上面的代码可以工作,除了我在数据库方面做错了。

所以我的问题来了:我需要改变什么才能让它工作?

【问题讨论】:

    标签: database postgresql heroku clojure heroku-postgres


    【解决方案1】:

    我知道,当您习惯了不同的范式时,一开始很难进入功能性思维。

    我不认为“如何正确地做这个循环”有一个正确的解释,因为在这里做一个循环是不对的。

    我觉得最不正确的两件事:

    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"]))))
    

    (根本没有循环。)

    【讨论】:

      猜你喜欢
      • 2018-07-18
      • 2015-12-18
      • 2015-08-21
      • 1970-01-01
      • 2010-11-06
      • 2015-12-22
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      相关资源
      最近更新 更多