2013-04-17 55 views
2

我已經搜索了網頁並查看了postgresql-simple包的源代碼。如何從字段中獲取列名

查詢結果(或query_)的類型爲[QueryResults]。獲取字段的內容很容易,但任何人都可以顯示一些用於獲取列/字段名稱的示例代碼? PostgreSQL.Simple.FromField的Field類有一個name屬性,返回一個帶有列名的ByteString。但我根本無法從這個簡單的例子列舉的內容來獲得:

conn <- connect con 
    xs <- query_ conn "select pk,tfrom from feedback" 
    forM_ xs $ \(field1,field2) -> 
    putStrLn $ T.unpack field2 ++ " has key " ++ show (field1 :: Int) 

的東西,還列出列的名稱(即PK和tfrom)。

從存儲過程(或表格)中進行select *操作時,獲取字段/列名是非常有用的,這樣我們就可以輕鬆打印結果而無需更改表或存儲過程更改。

答案後,編輯是提供: 這裏是第一建議的工作代碼(B8是字節字符串):

putStrLn $ " is names " ++ (B8.toString (fromJust (name field2))) ++ " " ++ (B8.toString (fromJust (name field1))) 

現在,使用時仍然獲得兩個數據和字段名的問題作爲代碼的第一個建議將修復內容到類型字段 - 其中不包含數據本身,只是元數據。第二個建議修正了現在工作代碼如下所示:

forM_ xs $ \((data1,field1),(data2,field2)) -> 
    putStrLn $ " " ++ (B8.toString (fromJust (F.name field1))) ++ " " ++ (B8.toString (fromJust (F.name field2))) ++ " " ++ (T.unpack data2) ++ " " ++ (show (data1 :: Int)) 

我希望這證明對其他人有用。

回答

0

我目前沒有Postgres實例來檢查此問題,但您可以嘗試引入instance FromField Field where fromField f = return . const f,然後使用name獲取字段的名稱。你甚至可能會更普遍希望

instance FromField a => FromField (a, Field) where 
    fromField f bs = (,f) <$> fromField f bs 

除非我對這個庫是如何工作的,我很驚訝這些實例是不是有相當錯誤的。

+0

你的第一個建議很完美,非常感謝。我的代碼不需要任何更改,它只是讓我認爲可以工作的代碼 - 突然按預期工作。對於任何需要第二個建議的人來說:它需要啓用TupleSections和FlexibleInstances。 –

+0

你的第二個建議提供了數據和價值。查看我的原始問題以查看代碼示例。 –

0

不是一個正確的答案我害怕,但太長的評論。

如果你看一下庫的源代碼,你會看到下面的功能簡單/ Internal.hs

name Field{..} = unsafePerformIO (PQ.fname result column) 

的PQ是LIBPQ參考(標準的PostgreSQL客戶端庫)和fname讓你給出結果集和列索引的字段名。所以,顯然它是可用的。

現在,我不認爲這個函數是導出的,我不知道是否有辦法解決這個問題,因爲我是一個Haskell新手。顯然你可以很容易地修補源代碼。

但是,即使字段名可用,我也不認爲你能夠擁有動態結果集,而不需要將所有查詢列類型轉換爲文本(或類似的東西)。否則,postgresql-simple會將它們作爲Int或Date或其他類型返回。

相關問題