我正在构建一个 CRUD 应用程序,它使用 Persistent 提取数据并执行一些相当复杂的查询,例如使用窗口函数。由于 Persistent 或 Esqueleto 都不支持这些,我需要使用原始 sql。
一个很好的例子是,我想选择值不会与前一个值有很大偏差的行,所以在伪 sql 中条件是WHERE val - lag(val) <= x
. 我需要在 SQL 中运行此选择,而不是提取所有数据然后在 Haskell 中过滤,否则我将有办法处理大量数据。
这些查询返回许多列。但是,该RawSql
实例在具有 8 个元素的元组中达到最大值。所以现在我正在编写附加功能from9, to9, from10, to10
等等。之后,所有这些都使用 type 的函数进行转换(Single a, Single b, ...) -> DesiredType
。尽管这可以通过代码生成来缩短,但这种方法很简单,而且显然感觉不像是好的 Haskell。这让我很担心,因为我认为我的大多数查询都需要rawSql
.
您对如何改善这一点有什么建议吗?目前,我的主要想法是取消规范化数据库和重复数据,例如通过将滞后值包含为列,以便我可以使用 Esqueleto 查询数据。