【问题标题】:Query influxdb in Haskell在 Haskell 中查询 influxdb
【发布时间】:2023-11-29 03:01:01
【问题描述】:

我正在考虑开发一个应用程序来查询我们的 influxdb 服务器,我查看了 influxdb 库文档 (https://hackage.haskell.org/package/influxdb-1.2.2/docs/Database-InfluxDB.html) 但据我了解,您需要预先定义一些数据结构或者您不能查询任何东西。 我只需要能够让用户查询任何内容,而不必先在源中定义一些数据。

我想我可以用时间字段和值字段定义一些东西,然后使用“SELECT active as value FROM mem”之类的东西来强制它适应它。我认为这会起作用,但如果我以后需要查询两个字段,它就不太实用了。 我没有看到任何更好的解决方案?我仍然是 Haskell 的初学者,如果有任何提示,我将不胜感激。

编辑:

即使这样也行不通,因为显然它缺少那个位中的“字符串”构造函数:

:{
data Test = Test { time :: UTCTime, value :: T.Text }
instance QueryResults Test where
  parseResults prec = parseResultsWith $ \_ _ columns fields -> do
    time <- getField "time" columns fields >>= parseUTCTime prec
    String value <- getField "value" columns fields
    return Test {..}
:}

我从文档中复制了它,只是更改了字段,不确定应该在哪里声明“字符串”。

【问题讨论】:

  • String 来自Data.Aeson
  • 真的,谢谢!现在我的查询得到一个空结果..但至少它编译

标签: haskell influxdb


【解决方案1】:

我不知道“InfluxDB”是什么,但我可以阅读 Haskell 类型签名,所以也许我们可以这样开始:

import Data.Aeson
import qualified Data.Aeson.Types as A
import qualified Data.Vector as V

newtype GenericRawQueryResults = GenericRawQueryResults Value
  deriving Show

instance FromJSON GenericRawQueryResults where
  parseJSON = pure . GenericRawQueryResults

instance ToJSON GenericRawQueryResults where
  toJSON (GenericRawQueryResults v) = v

instance QueryResults GenericRawQueryResults where
  parseResults _ val = pure (V.singleton (GenericRawQueryResults val))

然后尝试您的查询。

根据我通过阅读库的代码可以猜到的结果,流入数据库查询的结果到达了一个 json 对象内的 parseResults,该对象具有一个名为 "results" 的键,该键指向一个对象数组,每个对象都有一个键名为"series" 或名为"error" 的键,假设您编写一个解析器将"series" 指向的每个元素转换为您想从数据库中读取的任何类型。

除了那里有更多的框架,如果我更多地了解 InfluxDB 是什么以及它返回什么样的数据,我可能会理解。

在任何情况下,这都会让您尽可能接近原始结果,就像库让您获得的结果一样。您可能会做的另一件事是安装 aeson-pretty 软件包,删除 deriving Show 位并执行以下操作:

instance Show GenericRawQueryResults where
  show g = "decode " ++ show (encodePretty g)

(或者您可以保留派生的Show 实例并将encodePretty 应用于您的查询结果以显示它们)

【讨论】: