【发布时间】:2016-05-15 00:55:40
【问题描述】:
我正在尝试使用 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 子句构建为一个大向量,并在最后将它们全部添加到查询映射中吗?
任何建议将不胜感激!
【问题讨论】: