簡體   English   中英

使用Clojure / Hugsql處理nil參數

[英]Handling nil parameters with Clojure/Hugsql

我正在使用帶有Clojure的Hugsql來訪問Postgresql數據庫。 我的幾個數據庫表都有可選列 - 舉個簡單的例子,考慮一個帶有各種地址列的“用戶”表 - address1,address2,city等。

當我為“更新”編寫Hugsql查詢規范時,我不知道我傳入的地圖中將出現哪些值。所以如果我寫一個查詢:

-- :name update-user! :! :n
UPDATE users set firstname = :firstname, address1 = :address1 where id = :id

但傳入用戶地圖

(update-user! {:id "testuser" :firstname "Bartholamew"})

然后拋出一個異常。 我希望它可以創造類似的東西

UPDATE users SET firstname='Bartholamew', address1=NULL where id='testuser'

我查看了Hugsql源代碼 - 它調用了一個(validate-parameters)函數,該函數拋出了我無法看到的異常。 我確定我遺漏了一些明顯的東西:這似乎不是一個不尋常的要求,我確定不希望為可選列的每個可能組合編寫不同的SQL查詢規范。

有沒有辦法處理我遺漏的缺失參數? 我是否通過使用可選列來濫用數據庫?

您可以使用HugSQL的Clojure表達式根據運行時提供的參數有條件地支持您所需的SQL。 所以,你可以這樣寫:

-- :name update-user! :! :n
UPDATE users SET
id = id
--~ (when (contains? params :firstname) ",firstname = :firstname")
--~ (when (contains? params :address1) ",address1 = :address1")
WHERE id = :id

注意: id=id在這里處理逗號有點傻。 你可以使用HugSQL文檔中的這個例子做一些更強大和通用的東西:

SQL:

-- :name clj-expr-generic-update :! :n
/* :require [clojure.string :as string]
            [hugsql.parameters :refer [identifier-param-quote]] */
update :i:table set
/*~
(string/join ","
  (for [[field _] (:updates params)]
    (str (identifier-param-quote (name field) options)
      " = :v:updates." (name field))))
~*/
where id = :id

Clojure的:

(clj-expr-generic-update db {:table "test"
                             :updates {:name "X"}
                             :id 3})

我還鼓勵您查看並了解底層jdbc庫中的可用內容。 HugSQL的默認適配器是clojure.java.jdbc,它的update! 功能具有類似的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM