2017-07-04 24 views
0

我对Clojure非常陌生,我正在使用Clojure,Compojure和java.jdbc创建一个带有POSTGRES数据库的小型Web API。从Jdbc4Array中提取Clojure vec

我的一个表中包含的整数的数组作为它的列中的一个,并且被定义为这样:

    (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(而不是A VEC):

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

我似乎无法弄清楚Ø如何把它变成一个Clojure vec。我看过几个例子,但他们似乎正在使用我不是的流。我正在做这个查询不正确吗?我将如何将其转换为Clojure vec?

+0

你试过访问与调用返回的数据'getResultSet'?你会使用Java互操作来做到这一点。 –

+0

@ChrisMurphy谢谢你的想法。我试过'.getResultSet'和'.getJavaArray',但是当我这样做的时候我得到这个错误:'org.postgresql.util.PSQLException:这个连接已经关闭.' – Mike2012

回答

1

Jdbc4Array实施java.sql.Array;我没有PG数据库或调用代码手,但根据文档的java.sql.Array,你应该能够调用:

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

但是,你不应该这样做手工整个代码。通过将clojure.java.jdbc/IResultSetReadColumn协议扩展为java.sql.Array,您可以自动为您自动完成从Jdbc4Array到Vector的转换。

这一点已经在这里证明了在计算器上:

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

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

相关问题