我正在使用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数据类型。帮助
答案 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的类,并告诉驱动程序 要使用的类型名称和类名。对此不利的是 每次建立连接时都必须调用此方法。