编译时 Zig ORM

这是一篇关于 Comptime Zig ORM 的 2025 年 3 月 19 日的帖子,可视为高级 Zig 教程,涵盖语言的独特方面,需先了解Zig 语言参考

  • 学习方法:通过构建程序的“玩具”版本学习效果极佳,如编写 raytracer 来学习 Zig,作者在为帖子修改 TigerBeetle 代码时也学到很多。
  • 数据库实现

    • 定义账户(Account)和转账(Transfer)对象,ID 为枚举类型且用零表示未分配,通过自动递增计数器分配 ID。
    • 实现一个内存中的关系型数据库,其模式在编译时设置,通过DBType创建数据库类型,包含账户和转账表及转账的索引。
    • 编写函数create_transfer进行转账操作,包括余额检查和数据库更新,需传入分配器gpa,返回可能为null的转账 ID。
  • 使用示例

    • 在测试程序中,创建gpa_instancerandom_instance,初始化数据库DB,创建账户和转账,使用pareto_index函数生成随机账户和转账,进行关系型查询,如查找特定账户的转账。
    • 推荐读者复制代码并自己实现db.zig,以获得更有效的学习。
  • 表的实现

    • 基本数据结构是按特定字段排序的列表,这里用简单排序数组模拟,通过TableType创建表,传入键类型、值类型和提取及比较键的函数。
    • 表的实现包括搜索、获取、预留、插入和删除等函数,还提到批处理操作可提高效率。
  • 索引实现

    • 为实现按特定字段过滤转账,添加第二个排序列表存储(Account.ID, Transfer.ID)对,以保持两个列表同步。
    • 通过IndexTableType创建索引表,参数为值类型和要建立索引的字段,内部实现通过比较字段和 ID 来排序。
    • order_by函数用于比较多个字段,order_enums帮助比较数字或枚举。
  • 捆绑实现

    • Bundle用于创建和查找值并维护索引一致性,通过BundleType创建,包含对象表和索引表。
    • create函数分配空间并插入值到对象表和索引表,update函数更新值并保持索引一致。
  • 合并排序连接

    • filter函数用于过滤符合条件的对象,通过反射确定需要相交的索引表数量,设置索引和输出缓冲区的指针。
    • 使用合并算法找到符合条件的对象 ID,通过搜索索引表获取切片,然后合并切片找到最小 ID 并添加到输出。
  • 数据库工厂实现

    • DBType函数将模式转换为包含索引的捆绑,通过遍历模式中的表和索引来创建捆绑。
  • 后记:强调此练习虽有用但应避免过度使用 comptime 反射,推荐相关 Zig 学习资源。
阅读 9
0 条评论