如何在clojure中使用yesql插入和更新postgres数组?

时间:2016-02-19 19:10:44

标签: postgresql clojure

我试过传递一个clojure向量,也尝试了以下格式:

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

但这两种方法都会引发数据不匹配错误。

我想如果我可以从查询文件中调用postgres数组函数,那么可以轻松地进行更新和插入。请帮忙。

提前致谢

2 个答案:

答案 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的向量