2016-05-15 6 views
1

honeysqlを使用してプログラムでクエリを作成し、where句を追加しています。節はクリーンではない私のhoneysqlを使用して、しかしhoneysql merge-大規模なクエリを構築する場所

In [3]: query = model.Account.query 
In [4]: query = query.filter_by(id=1) 
In [5]: query = query.filter_by(email='[email protected]') 
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 = '[email protected]' 
     AND account.username = 'someuser' AND account.is_active = 1 

のpythonから来るとSQLAlchemyのを使用しては、私のような何かを行うことができます。

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

私は、彼らは論理的に同じものだということを承知していますが、私はより多くの複合体を得るために開始すると、私はいくつかの微妙なクエリは、余分なと奇妙な演技を取得私はつもりだと緊張し始めています私の問題を引き起こす敬意。

私はクレイジーですか?私は心配を停止し、余分なparensを愛することを学ぶべきです(結局のところclojureです)?それとも、私が気づいていないクエリ構築のためのより良いパターンがありますか?私はwhere節を大きなベクトルとして構築し、それらをすべて最後にクエリマップに追加する必要がありますか?

アドバイスをいただければ幸いです! a、b、cは

A = 1 

。アンド演算子は、それがどこカッコ関係ないことを意味し、連想されるように提案されている

答えて

0

論理的観点からそれを見

a AND b AND c = (a AND b) AND c = a AND (b AND c). 

命題の系列が同じままである限り、配置されるか、またはいくつあるか。

解決済みの例here.

+1

こんにちは、お返事ありがとうございます。ええ、私は彼らが論理的に同じ結果であることに気づいたと言いましたが、私はまだ「オハイオ州の男、私が追加した12番目の奇妙な句の後に、括弧が問題になる! - 私はちょうどよりきれいな結果があったと思っていた。私のコードでは、句のリストを作成し、大きな '[:and]'節の最後に 'merge-where'を一度使用するようにしました。再度、感謝します! – Hoopes

関連する問題