postgresql - 如何从字段中获取列名

标签 postgresql haskell

我在网上搜索并查看了 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)))

现在,在使用第一个建议时仍然存在获取数据和字段名称的问题,因为代码会将内容固定为字段类型 - 它不包含数据本身,仅包含元数据。第二个建议解决了这个问题,现在工作代码如下所示:

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

我希望这对其他人也有用。

最佳答案

我现在没有 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

除非我对这个库的工作方式有很大的误解,否则我很惊讶那些实例不在那里。

关于postgresql - 如何从字段中获取列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16070448/

相关文章:

sql - 在不计数的情况下获取没有行的表

sql - 奇怪的 pgsql 查询性能

postgresql - 如何在 Postgres.app 中降级/拥有以前版本的 Postgres DB

haskell - Haskell 中空列表的模式匹配

haskell - MonadResource 中的资源释放顺序

php - 正确减去PHP中的时间

postgresql - Vapor 中的多个数据库

parsing - Haskell 解析 - Parsec 与 Alex

graphics - 用于 2D 绘图的 Haskell 库

haskell - Haskell 中的 GC 在软实时应用程序中暂停