从Jdbc4Array中提取Clojure vec

时间:2017-07-04 19:24:02

标签: postgresql jdbc clojure

我是Clojure的新手,我正在使用Clojure,Compojure和带有POSTGRES数据库的java.jdbc创建一个小型Web API。

我的一个表包含一个整数数组作为其列之一,并定义如下:

                    (sql/create-table-ddl
                     :games
                     [:id :serial "PRIMARY KEY"]
                     [:active :BOOLEAN "NOT NULL"]
                     [:players "integer[]" "DEFAULT array[]::integer[]"]
                     [:player_order "integer[]" "DEFAULT array[]::integer[]"]
                     [:created_at :timestamp
                      "NOT NULL" "DEFAULT CURRENT_TIMESTAMP"])

我正在尝试查询整数[]之一:

(sql/query postgres  [(str "SELECT * FROM games WHERE id=" game-id)])

但是POSTGRES返回一个Jdbc4Array(而不是vec):

:player_order #<Jdbc4Array {1,2,3,4}
org.postgresql.jdbc4.Jdbc4Array

我似乎无法弄清楚如何将其变成Clojure vec。我已经看过一些例子,但他们似乎正在使用我不是的流。我不正确地进行此查询吗?我如何将其转换为Clojure vec?

1 个答案:

答案 0 :(得分:1)

Jdbc4Array实施java.sql.Array;我没有PG数据库或调用代码,但根据java.sql.Array的文档,您应该可以致电:

(into [] (.getArray your-val))

但是,您不必在整个代码中手动执行此操作。您可以通过将Jdbc4Array协议扩展到clojure.java.jdbc/IResultSetReadColumn来自动完成从java.sql.Array到Vector的转换。

这已在StackOverflow上演示过:

https://stackoverflow.com/a/25786990/152739

(我不想逐字复制那个家伙的答案!)