在Clojure中使用PGobject

时间:2015-09-19 07:19:22

标签: postgresql clojure

我正在使用Clojure,YeSQL和Postgres。

我有一个简单的postgres表,如下所示:

CREATE TABLE foo (
  id SERIAL PRIMARY KEY,
  num INT NOT NULL DEFAULT 1,
  txt TEXT NOT NULL
);

我在一个文件中有一个查询,如下所示:

SELECT (id, num, txt) FROM foo WHERE id = :id

我预加载数据库:

INSERT INTO foo (num, txt) VALUES (5, 'potato');

当我通过yesql加载查询并在repl中运行它时,我得到了这个结果:

=> (yesql/defquery get-record "foo.sql")
nil
=> (def rec (get-record 1))
({:row #<PGobject (1,5,"potato")>})

我完全不知道如何使用PGobject ...我试着查看一些说明(https://jdbc.postgresql.org/documentation/publicapi/org/postgresql/util/PGobject.html),但显然我不知道如何处理那里的任何事情

我希望得到类似地图的东西,也许:

{:id 1
 :num 5
 :txt "potato"}

但我刚收到这个PGobject的东西,我不知道如何从中获取数据。是否有某种可用的方法可以让我获得,例如,(:num rec)之类的num或txt(这就是我所期望的那样)。

即使我可以弄清楚如何将PGobject变成某些我知道会很高兴的clojure数据类型。帮助

1 个答案:

答案 0 :(得分:2)

好的,我明白了。问题是我的查询中的分组。我的查询使用:

SELECT (id, num, txt) FROM foo WHERE id = :id

将结果分组为括号。这会导致Postgres JDBC驱动程序将结果作为分组集返回,这不是JDBC驱动程序能够理解的数据类型。

相反,我应该使用:

SELECT id, num, txt FROM foo WHERE id = :id

在这种情况下,代替({:row #<PGobject (1,5,"potato")>})(第一个查询的结果),我得到了更好的({:id 1, :num 5, :txt "potato"})

相关信息最终来自此网站http://www.postgresql.org/docs/7.1/static/jdbc-ext.html;特别是以下部分:

  

这允许客户端代码为PostgreSQL之一添加处理程序   独特的数据类型。通常,驱动程序不知道的数据类型是   由ResultSet.getObject()作为PGobject实例返回。这种方法   允许你编写一个扩展PGobject的类,并告诉驱动程序   要使用的类型名称和类名。对此不利的是   每次建立连接时都必须调用此方法。