Clojure honeysql合并,其中构建大型查询

Clojure honeysql合并,其中构建大型查询,clojure,honeysql,Clojure,Honeysql,我尝试使用honeysql以编程方式构建查询,并在执行时添加where子句 来自python并使用sqlalchemy,我可以执行以下操作: In [3]: query = model.Account.query In [4]: query = query.filter_by(id=1) In [5]: query = query.filter_by(email='abc@foo.com') In [6]: query = query.filter_by(username='someuser')

我尝试使用honeysql以编程方式构建查询,并在执行时添加where子句

来自python并使用sqlalchemy,我可以执行以下操作:

In [3]: query = model.Account.query
In [4]: query = query.filter_by(id=1)
In [5]: query = query.filter_by(email='abc@foo.com')
In [6]: query = query.filter_by(username='someuser')
In [7]: query = query.filter_by(is_active=1)
In [8]: printquery(query)

SELECT *
FROM account
WHERE account.id = 1 AND account.email = 'abc@foo.com' 
      AND account.username = 'someuser' AND account.is_active = 1
然而,使用honeysql,我的where子句并没有那么干净

user=> (require '[honeysql.core :as sql])
user=> (require '[honeysql.helpers :refer :all])
user=> (->
  #_=>   (select :*)
  #_=>   (from :test)
  #_=>   (merge-where [:= :a 1])
  #_=>   (merge-where [:= :b 2])
  #_=>   (merge-where [:= :c 3])
  #_=>   (merge-where [:= :d 4])
  #_=>   sql/format)

["SELECT * FROM test WHERE (((a = 1 AND b = 2) AND c = 3) AND d = 4)"]
我知道它们在逻辑上是一样的,但随着我变得越来越复杂,我开始感到紧张,因为我会遇到一些微妙的疑问,与额外的帕伦一起表现得很怪异,这会给我带来问题

我疯了吗?我是否应该停止担忧,学会爱那些额外的父母(毕竟这是clojure)?或者我不知道有没有更好的查询构建模式?我是否应该将where子句构建为一个大向量,并将它们全部添加到查询映射的最后


任何建议都将不胜感激

从逻辑的角度来看它

a AND b AND c = ( a AND b ) AND c = a AND ( b AND c ).
其中a、b和c是如下命题:

A = 1
AND运算符是关联的,这意味着只要命题的顺序保持不变,括号放在哪里或放多少并不重要


计算出的示例

从逻辑角度看

a AND b AND c = ( a AND b ) AND c = a AND ( b AND c ).
其中a、b和c是如下命题:

A = 1
AND运算符是关联的,这意味着只要命题的顺序保持不变,括号放在哪里或放多少并不重要


已完成示例

嗨,谢谢你的回答。是的,我提到我意识到它们在逻辑上是相同的结果,我还没有想出一些例子“哦,天哪,在我添加了第12个奇怪的条款之后,帕伦夫妇成了一个问题!”-我只是希望有一个更干净的结果。在我的代码中,我已经习惯于建立一个子句列表,然后在一个大的
[:and]
子句的末尾使用
merge where
。再次感谢!嗨,谢谢你的回答。是的,我提到我意识到它们在逻辑上是相同的结果,我还没有想出一些例子“哦,天哪,在我添加了第12个奇怪的条款之后,帕伦夫妇成了一个问题!”-我只是希望有一个更干净的结果。在我的代码中,我已经习惯于建立一个子句列表,然后在一个大的
[:and]
子句的末尾使用
merge where
。再次感谢!