database - 获取记录字段的文本表示?

标签 database haskell field records typesafe

有以下记录:

data Sleep = Sleep
   { _duration :: Maybe Int
   , _drunk :: Bool
   }

有没有办法做到以下几点:

deriveSomething ''Sleep

fieldName duration :: String -- "duration"

我需要它来更新类型安全的数据库特定字段,即:

setField connection key duration (Just 50)

虽然它需要与数据库无关(因此 opaleye 等已出局)。

(如果这可以通过像 lens 这样的标准包来实现,那就更好了,但我找不到任何东西。)

最佳答案

您可以使用 Data.Data 执行此操作:

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data

data Sleep = Sleep
    { _duration :: Maybe Int
    , _drunk :: Bool
    } deriving (Typeable, Data)

fieldNames :: Data a => a -> [String]
fieldNames = constrFields . toConstr

例子:

> fieldNames (Sleep undefined undefined)
["_duration", "_drunk"]

之后您必须决定如何将名称转换为数据库列,但这应该相当容易。

这需要使用特定构造函数创建的值,请记住数据类型可以有许多构造函数。没有办法解决这个问题,但你可以有类似的东西

sleepFieldNames :: [String]
sleepFieldNames = fieldNames (Sleep undefined undefined)

这样您就不必不断地重新计算它。

关于database - 获取记录字段的文本表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35651252/

相关文章:

scala 等效于 java 公共(public)字段

mysql - SQLite查询获取两个维度记录(学生与测验)

mysql - 印度铁路数据库在车站之间连接火车时出错

haskell - 为什么初始代数对应于数据而最终余代数对应于余数据?

haskell - 带有可遍历的任意单子(monad)的组合总是单子(monad)吗?

elasticsearch - Elastica或ElasticSearch从所有文档中删除字段

node.js - 获取字段不是特定字符串的文档

django - 将数据库从本地 django 迁移到 heroku

haskell - 在 Nix 构建中禁用所有 Haskell 依赖项的构建和运行测试

java - this.getClass().getFields().length;总是返回 0