我试过传递一个clojure向量,也尝试了以下格式:
-- name: insert-into-sometable<!
-- inserts in the sometable the lid and uids
INSERT INTO sometable
(lid, uids) values(:lid, ARRAY[:uids])
但这两种方法都会引发数据不匹配错误。
我想如果我可以从查询文件中调用postgres数组函数,那么可以轻松地进行更新和插入。请帮忙。
提前致谢
答案 0 :(得分: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中的错误,:uid]
永远不会被解析为有效密钥。
编辑:即将提交yesql的错误,但已经修复了最近发布的0.5.2版本。
答案 1 :(得分:1)
yesql不支持SQL数组,但是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"]))
请注意,由于向量在yesql中具有special meaning,因此无法扩展Clojure的向量