簡體   English   中英

如何從字段獲取列名

[英]How to get column names from fields

我已經在網上搜索並查看了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是ByteString):

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

現在,仍然存在在使用第一個建議時同時獲取數據名稱和字段名稱的問題,因為代碼會將內容固定為類型Field-該類型不包含數據本身,而僅包含元數據。 第二個建議解決了,現在工作代碼如下所示:

  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))

我希望這對其他人也有用。

恐怕這不是一個正確的答案,但是評論太久了。

如果查看庫的源代碼,您將在Simple / Internal.hs中看到以下功能

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

PQ是對libpq(標准PostgreSQL客戶端庫)的引用,而fname為您提供給定結果集和列索引的字段名。 因此,顯然可以使用。

現在,我不認為該函數會導出,而且我是Haskell新手,所以我不知道是否有解決方法。 顯然,您可以輕松地修補源。

但是,我認為即使具有可用的字段名,您也無法擁有動態結果集,而無需將所有查詢列類型都轉換為文本(或類似內容)。 否則,postgresql-simple將以Int或Date或類似形式返回它們。

我目前沒有Postgres實例可以檢查此情況,但是您可以嘗試引入instance FromField Field where fromField f = return . const f instance FromField Field where fromField f = return . const f ,然后使用name來獲取字段的名稱。 您可能甚至更想要

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

除非我對這個庫的工作方式很誤解,否則我很驚訝那些實例不在其中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM