我用的是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或txt,比如
(:num rec)
(这是我所期望的)。即使我能弄清楚如何将PGobject转换成我认识的clojure数据类型,我也会很高兴的。帮忙?
最佳答案
好吧,我想出来了。问题是我的查询中的分组。我使用的查询:
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的类,并告诉驱动程序
要使用的类型名和类名。从反面看,是不是
每次建立连接时都必须调用此方法。
关于postgresql - 在Clojure中使用PGobject,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32665464/