Postgresql 如何从字段中获取列名

Postgresql 如何从字段中获取列名,postgresql,haskell,Postgresql,Haskell,我在网上搜索了一下postgresql简单包的源代码 查询(或查询)的结果类型为[QueryResults]。获取字段的内容很容易,但是有人能展示一些获取列/字段名的示例代码吗?PostgreSQL.Simple.FromField中的Field类有一个name属性,返回一个带有列名的ByTestString。但我无法从这个简单的示例中获得以下内容: conn <- connect con xs <- query_ conn "select pk,tfrom from fee

我在网上搜索了一下postgresql简单包的源代码

查询(或查询)的结果类型为[QueryResults]。获取字段的内容很容易,但是有人能展示一些获取列/字段名的示例代码吗?PostgreSQL.Simple.FromField中的Field类有一个name属性,返回一个带有列名的ByTestString。但我无法从这个简单的示例中获得以下内容:

  conn <- connect con
  xs <- query_ conn "select pk,tfrom from feedback"
  forM_ xs $ \(field1,field2) ->
    putStrLn $ T.unpack field2 ++ " has key " ++ show (field1 :: Int)
现在,在使用第一个建议时,仍然存在获取数据和字段名的问题,因为代码会将内容固定到type field,而type 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客户机库)的引用,它为您提供一个字段名,并提供一个结果集和列索引。所以,很明显,它是可用的

现在,我不认为这个函数是导出的,我不知道是否有办法解决这个问题,因为我是Haskell的新手。显然,您可以很容易地修补源代码


但是,我认为,如果不将所有查询列类型转换为文本(或类似的内容),即使有可用的字段名,也无法获得动态结果集。否则,postgresql simple将以Int或Date等形式返回它们。

我目前没有一个Postgres实例来检查这一点,但您可以尝试引入
instance FromField Field,其中FromField f=return。const f
然后使用
name
获取字段的名称。你可能更普遍地想要

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

除非我对这个库的工作原理有很大的误解,否则我很惊讶这些实例不在其中。

您的第一个建议非常有效,非常感谢。而且我的代码不需要修改,它只是让我认为可以工作的代码——突然如预期工作。对于任何支持第二个建议的人:它需要启用TupleSections和FlexibleInstances。您的第二个建议提供了数据和值。请参阅我的原始问题以获取代码示例。
instance FromField a => FromField (a, Field) where
  fromField f bs = (,f) <$> fromField f bs