Haskell Esqueleto 将列子集投影到自定义记录列表

2023-11-30

在所有的例子中我都看到了结果埃斯克莱托被投影到元组列表中或实体记录.

例如:

previousLogItems <- select $ from $ \li -> do
        orderBy [desc (li ^. LogItemId)]
        limit 10
        return (li ^. LogItemId, li ^. LogItemTitle)

esqueleto 中是否有任何方法可以将列的子集投影到自定义记录(与实体不同)而不是元组?这是在没有从元组到自定义记录的额外投影的情况下完成的。

举个例子,假设从数据库获取所有数据的效率很低,因此我们只想将数据库中的 WindowTitle 和 BeginTime 列投影到具有足够名称的自定义记录中。

Update

无效代码示例:

data Custom = Custom
  { title :: Text
  , id    :: Int
  } deriving (Eq, Show, Generic)

daily :: Servant.Handler [Custom]
daily = do
  lis <- liftIO $ runDB $
            select $ from $ \li -> do
                    orderBy [desc (li ^. LogItemId)]
                    limit 25
                    return (Custom (li ^. LogItemTitle) (li ^. LogItemId))
  return lis

Error:

• Couldn't match expected type ‘Text’
              with actual type ‘SqlExpr (Database.Esqueleto.Value Text)’
• In the first argument of ‘Custom’, namely ‘(li ^. LogItemTitle)’
  In the first argument of ‘return’, namely
    ‘(Custom (li ^. LogItemTitle) (li ^. LogItemId))’
  In a stmt of a 'do' block:
    return (Custom (li ^. LogItemTitle) (li ^. LogItemId))

Update

无效代码示例:

daily :: Servant.Handler [Custom]
daily = do
  lis <- liftIO $ runDB $
            select $ from $ \li -> do
                    orderBy [desc (li ^. LogItemId)]
                    limit 25
                    return (Custom <$> (li ^. LogItemTitle) <*> (li ^. LogItemId))
  return lis

Error:

• Couldn't match type ‘Database.Esqueleto.Value Text’ with ‘Text’
  Expected type: SqlExpr Text
    Actual type: SqlExpr (Database.Esqueleto.Value Text)
• In the second argument of ‘(<$>)’, namely ‘(li ^. LogItemTitle)’
  In the first argument of ‘(<*>)’, namely
    ‘Custom <$> (li ^. LogItemTitle)’
  In the first argument of ‘return’, namely
    ‘(Custom <$> (li ^. LogItemTitle) <*> (li ^. LogItemId))’


• Couldn't match type ‘Database.Esqueleto.Value (Key LogItem)’
                 with ‘Int’
  Expected type: SqlExpr Int
    Actual type: SqlExpr (Database.Esqueleto.Value (Key LogItem))
• In the second argument of ‘(<*>)’, namely ‘(li ^. LogItemId)’
  In the first argument of ‘return’, namely
    ‘(Custom <$> (li ^. LogItemTitle) <*> (li ^. LogItemId))’
  In a stmt of a 'do' block:
    return (Custom <$> (li ^. LogItemTitle) <*> (li ^. LogItemId))

esqueleto 在这里实际做的事情有点复杂。这是类型select:

select :: (SqlSelect a r, MonadIO m) => SqlQuery a -> SqlReadT m [r]

这需要一个SqlQuery a(一个 monad 包装了你的值return),并返回一个SqlReadT m [r](一个包含结果列表的 monad)。当你return your Custom类型,会发生以下情况:

  1. esqueleto 转换你的a持久化内部 SQL 表示形式的类型
  2. 持续执行查询并返回结果列表
  3. esqueleto 将结果列表从持久化的内部 SQL 表示形式转换为[r]

要使其适用于自定义类型,您需要实例化查询语句,并定义与持久类型之间的转换函数:

data Custom' = Custom' (Value Text) (Value Int)

data Custom = Custom
  { title :: Text
  , id    :: Int
  }

instance SqlSelect Custom' Custom where
  sqlSelectCols esc (Custom' a b) = (mconcat [ta, ", ", tb], va ++ vb)
    where
      (ta, va) = sqlSelectCols esc a
      (tb, vb) = sqlSelectCols esc b
  sqlSelectColCount _ = 2
  sqlSelectProcessRow [PersistText a, PersistInt64 b] = Right $ Custom a b
  sqlSelectProcessRow _ = Left "Error: Incorrect rows to translate to Custom"

(请注意,我实际上无法测试上述任何内容,因此可能存在错误)

需要注意的一点是,在上面的示例中,a and r类型不相同(Custom' vs Custom)。这是因为在一个select,您正在使用的所有值都是类型Value,而不是它们的实际类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell Esqueleto 将列子集投影到自定义记录列表 的相关文章

随机推荐

  • JavaScript 正则表达式原型

    为什么 Chrome 的控制台显示 对于 RegExp 的原型 console log RegExp prototype console log a proto 这是特定于实现的吗 IE 正在显示 这只是出于好奇而提出的问题 当我遇到这个问
  • 如何让 IBM DB2 提供程序与 Entity Framework 4.0 一起使用

    有人可以告诉我如何让 DB2 提供程序显示在 更改数据源 对话框窗口中吗 Steps 右键单击 edmx 设计图面 选择 从数据库更新模型 在更新向导中 单击 新连接 在 数据源 文本框旁边 单击 更改 在 更改数据源 窗口中 我仅在列表中
  • 没有主键可供引用的外键

    我有以下两张表 CREATE TABLE parent c1 INTEGER CREATE TABLE child c1 INTEGER c2 INTEGER c3 INTEGER CONSTRAINT fk c3 FOREIGN KEY
  • 读取VC++ CArchive二进制格式(或Java读取(CObArray))

    是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档 我已经能够在十六进制编辑器中查看我自己的一些类 并使用 Java 的 ByteBuffer 类来读取它们 通过自动字节顺序转换等 然而 我目前在尝试引入 CObArray 数
  • OpenGL 离屏渲染

    我有一个应用程序 可以创建 3D 模型并从中导出图像 我用这个例子来做到这一点 include
  • 在 Glance Widget 中复制 Canvas 的最佳方式?

    在 Compose 中我们有方法Canvas 画线等 Glance中有类似的功能吗 如果没有 复制 Canvas 功能的最佳方法是什么 None
  • 为什么 sphinx 在同一行上格式化我的文档字符串参数

    我对 sphinx 比较陌生 想为我的项目生成文档 我的函数之一的示例可以在 Predict py 中找到 def arima rolling forecast training set testing set order solver l
  • 加载程序集和版本控制

    我正在考虑通过提供一些预定义的接口来向现有应用程序添加一些可扩展性 这些接口可以通过放置在特定位置并由应用程序拾取的 插件 来实现 应用程序的核心很少更新 而插件更新和部署则更加频繁 基本上 有这样的设置 in core assembly
  • 带有线性渐变的CSS过渡[重复]

    这个问题在这里已经有答案了 我正在尝试向一个按钮添加一个过渡 该按钮的背景是用 css 线性渐变制作的 但它不起作用 这是我的按钮的 CSS a button background webkit gradient linear left t
  • doctrine2 和 group_concat

    我一直在浏览文档 谷歌 但没有找到任何解决方案 有没有办法在没有本机mysql的情况下使用doctrine2 DQL 执行或模仿GROUP CONCAT eg SELECT u id u name GROUP CONCAT AS user
  • 错误:您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展

    我是 WordPress 新手 上传网站后我遇到了这个错误 该网站运行良好一段时间 然后就发生了这种情况 输入 URL 后 此文本将显示 您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展 转到 php ini 但找不
  • 使用自定义成员资格和角色提供程序在 MVC 中实现 IPrincipal 和 IIdentity

    我一直坚持自定义 iprincpal 和 iidentity 对象的实现 我现在花了一天的时间来搜索如何实施这些权利并用更多信息来扩展它 我想扩展信息 Context User Identity Name使用全名或其他名称等自定义变量 ED
  • 使用“if”语句检查后出现空指针异常

    我遇到了一个非常烦人的错误 说我遇到了空指针异常 但有一个 if 语句来检查文本是否为空 然后再继续 public String getFileData throws IOException String file name C Users
  • 使用 Passport js failureRedirect 方法发回数据

    我有一个 Passport js 本地注册策略 它使用 successRedirect 和 failureRedirect 方法 问题是 如果注册过程出现错误 Passport 只会重定向回注册表单 表单中没有任何数据 app post s
  • 您可以通过其中的符号对齐文本吗?

    我想显示这样的电子邮件地址列表 email protected email protected email protected email protected email protected hinxterpexterp email pro
  • VBA在循环期间在数组中存储多列然后返回值

    我有一个宏 它将用户定义的函数 代码中的 R ajseasonX13 应用于工作表 NSA 中的多个列 然后返回工作表 SA 中的值 问题是我的代码一次仅将该函数应用于一个列 一旦 VBA 不断在选项卡 NSA 和 SA 之间来回移动 结果
  • 如何在 Spring config.xml 中配置 Cron 时区?

    我有一个带有 Cron 任务的 Spring 配置 xml 文件 该任务在我的机器上定期执行 如何在 xml 文件中配置此任务以使用莫斯科时区 与我的时区不同
  • 更改浏览器缩放级别

    我需要在我的网站上创建 2 个按钮来更改浏览器缩放级别 由于图像大小和布局问题 我请求浏览器缩放而不是 css 缩放 嗯 这可能吗 我听到了相互矛盾的报道 尽管在 Firefox 中不起作用 但在 IE 和 chrome 中可以使用 img
  • sci-kit learn:使用 X.reshape(-1, 1) 重塑数据

    我正在训练一个用于文本分类的 python 2 7 11 分类器 在运行时我收到一条已弃用的警告消息 表明我不知道代码中的哪一行导致了它 错误 警告 但是 代码运行良好并给了我结果 AppData Local Enthought Canop
  • Haskell Esqueleto 将列子集投影到自定义记录列表

    在所有的例子中我都看到了结果埃斯克莱托被投影到元组列表中或实体记录 例如 previousLogItems lt select from li gt do orderBy desc li LogItemId limit 10 return