2015-09-19 74 views
1

我正在使用Clojure,YeSQL和Postgres。在Clojure中使用PGobject

我有一個簡單的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

好的,我想通了。問題在於我的查詢中的分組。我的查詢使用:

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的類,並告訴驅動程序 要使用的類型名稱和類名。不利的一面是,你必須在每次建立連接時調用這個方法 。