database - 使用 Clojure 在数据库上循环

标签 database postgresql heroku clojure heroku-postgres

我刚开始在 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))
)

因为我在写这篇文章之前尝试了各种方法,所以我知道上面的代码是有效的,除了我在数据库方面做错了什么。

所以我的问题来了:我需要更改什么才能使其正常工作?

最佳答案

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

我认为对于“如何正确执行此循环”没有正确的解释,因为在这里执行循环是不正确的。

我觉得最不对的两件事:

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

(完全没有循环。)

关于database - 使用 Clojure 在数据库上循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42291018/

相关文章:

mysql - 插入或更新存储过程

mysql - ERROR 1075 只能有一个自动列,并且必须将其定义为键。帮助我确定如何保留 ReportID 的外键

sql - 用于网站的 postgresql 和 neo4j 的组合

sql - HSQLDB 从另一个表的字段更新一个表的字段

c++ - 修复 lib 兼容性 c++ mingw 和 postgresql

reactjs - Heroku : 404 (Not Found), "dist/"未创建

php - 将php数组插入mysql表

c# - 在 app.config 之外的 Entity Framework 中为 PostgreSQL 数据库设置一个 connectionString

ruby-on-rails - ExecJS::RuntimeError: SyntaxError: 意外的标记:运算符 (>) (行:22342,列:24,位置:826182)

java - Android HTTP客户端抛出异常