使用 GADTs 在 OCaml 中嵌入类型安全的 SQL API

主要观点:在 OCaml 中与 SQL 数据库交互的接口编写和维护通常不太令人满意,因为多数 SQL 接口不支持在运行前检查 SQL 操作,且 SQL 操作与程序逻辑和数据紧密耦合难以隔离测试。作者构建大型 SQL 应用时遇到此问题,最终研发出新的类型安全嵌入式 SQL API——Petrol。
关键信息

  • Caqti 是 OCaml 中与 SQL 交互的标准库,通过字符串嵌入 SQL 语句并标注类型,运行时检查输入输出类型,复杂查询时手动检查困难。
  • 初步解决方案是通过宏实现静态检查逻辑,如ppx_sql,可自动生成表的类型和查询的编码解码,但存在不能表示迁移、无语言支持写查询、SQL 语法不足以推导包装器等问题。
  • 使用 GADTs 实现类型安全的 eDSL,通过扩展类型系统来约束数据类型,定义基于 GADT 的 SQL 表达式和语句编码,提供更便捷的函数构造查询,可自动编码解码值,静态检查查询的有效性,且接口不依赖 SQL 语法。
    重要细节
  • Petrol 与其他语言的类似库概念相似,但在 OCaml 生态中较缺失。Caqti 近期采用更便捷的声明风格,但仍存在运行时检查问题。
  • 通过 GADTs 编码的 SQL eDSL 可利用 OCaml 的类型检查和推理能力,无需重新实现静态支持,还可引入小扩展指定无法自动推断的信息。
  • 总结时提到在功能语言编程中,可先考虑使用 GADTs 等高级特性将所需检查直接嵌入宿主语言,而非直接进行元编程。最后提及 OCaml 有新的 typed eDSL 用于表达 SQL 表和查询,即 Petrol。
阅读 15
0 条评论