Postgresql 在Clojure中使用PGobject
我正在使用Clojure、YeSQL和Postgres 我有一个简单的postgres表,如下所示:Postgresql 在Clojure中使用PGobject,postgresql,clojure,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 我在一个文件中有一个查询,如下所示: CREATE TABLE foo ( id SERIAL PRIM
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
我在一个文件中有一个查询,如下所示:
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的东西,我不知道如何从中获取数据。是否有一些可用的方法可以让我获取,例如,num或txt,比如(:num rec)
(这是我所期望的)
即使我能想出如何将PGobject转换成我认识的clojure数据类型,我也会很高兴。帮助?好的,我知道了。问题是我查询中的分组。我的查询使用:
SELECT (id, num, txt) FROM foo WHERE id = :id
将结果分组为parenthases。这会导致Postgres JDBC驱动程序将结果作为分组集返回,而JDBC驱动程序并不十分理解这种数据类型
相反,我应该使用:
SELECT id, num, txt FROM foo WHERE id = :id
在这种情况下,我得到的不是({:row#})
(第一次查询的结果),而是一个更好的({:id 1,:num 5,:txt“potato”})
相关信息最终来自这个网站;特别是其中的一节:
这允许客户机代码为PostgreSQL的一个或多个应用程序添加处理程序
唯一的数据类型。通常,驱动程序不知道的数据类型是
由ResultSet.getObject()作为PGobject实例返回。这种方法
允许您编写扩展PGobject的类,并告诉驱动程序
要使用的类型名和类名。这件事的缺点是什么
每次建立连接时都必须调用此方法