2016-02-19 35 views
5

我試圖傳遞一個Clojure的載體,也嘗試採用以下格式:如何在clojure中使用yesql插入和更新postgres數組?

-- name: insert-into-sometable<! 
-- inserts in the sometable the lid and uids 
INSERT INTO sometable 
(lid, uids) values(:lid, ARRAY[:uids]) 

但是這兩種方法拋出數據不匹配錯誤。

我想如果我可以從查詢文件中調用postgres數組函數,那麼更新和插入可以很容易地完成。請幫忙。

在此先感謝

+0

我可能會吠叫錯誤的樹,但[這看起來像一個好地方開始](https://github.com/remodoy/clj-postgresql/blob/master/README.md)。不知道這是否適用於Yesql。 –

回答

4

你的第二試的錯誤消息給出了一個微妙的暗示:

AssertionError Assert failed: Query argument mismatch. 
Expected keys: (:uids]) 
Actual keys: (:uids) 
Missing keys: (:uids]) 

顯然,當yesql嘗試解析:uids鍵時,它會向南移動,因爲它附加了數組定義的右括號。讓我們嘗試別的東西:

-- name: insert-into-sometable<! 
-- inserts in the sometable the lid and uids 
INSERT INTO sometable 
(lid, uids) values(:lid, ARRAY[ :uids ]) 

注意:uids和陣列括號之間多餘的空格。

=> (insert-into-sometable<! {:lid 1, :uids [1 2 42]) 
;; => 1 

貌似yesql給我一個bug,:uid]應該永遠不會解析爲一個有效的密鑰。

編輯:即將提出一個與yesql的錯誤,但它已經修復了最近發佈的0.5.2版本。

1

SQL數組不被yesql支持,但clojure.java.jdbc在ISQLParameter protocol提供了一個擴展點,它可以直接使用:

(deftype StringArray [items] 
    clojure.java.jdbc/ISQLParameter 
    (set-parameter [_ stmt ix] 
    (let [as-array (into-array Object items) 
      jdbc-array (.createArrayOf (.getConnection stmt) "text" as-array)] 
     (.setArray stmt ix jdbc-array)))) 

(insert-into-sometable<! db-spec "hi" (->StringArray ["one" "two"])) 

請注意,你不能擴展Clojure的載體作爲載體在yesql一個special meaning

相關問題