Wang Fenjin
Recent content on Wang Fenjin
马上订阅 Wang Fenjin RSS 更新: https://www.wangfenjin.com/index.xml
duckdb-rs 即将成为 DuckDB 官方 rust 客户端
背景
DuckDB 是一个 C++ 编写的单机版嵌入式分析型数据库。它刚开源的时候是对标 SQLite 的列存数据库,并提供与 SQLite 一样的易用性,编译成一个头文件和一个 cpp 文件就可以在程序中使用,甚至提供与 SQLite 兼容的接口,因此受到了很多人的关注。
我很久之前就开始关注 DuckDB,并在 2021-06-07 开始写第一行 duckdb-rs 的代码,在 一个多月后写了一篇博客介绍了构建这个库的过程,算是实现了第一个版本。到今天差不多2年的时间,前后发布了19个版本,收获了 200 多个star。
最近一年其实还有很多需求和想法去做优化,但是发现自己并没有那么多时间,收到的 issue 也越来越多。经过沟通,我会把这个库转给 DuckDB 官方来维护,相信 duckdb-rs 一定会发展得越来越好。同时也非常感谢 Mark 和 Hannes 愿意接手这个仓库并把它作为官方的 rust 客户端。
这篇博客总结下我维护的这段时间主要做的事,以及我认为可以改善的点,算是对过去的总结和对未来的憧憬。
关键决策
这个库是 duckdb 的 rust 客户端,所以关注这个库的群体首先是认可 duckdb 的用户,其次因为他们是 rust 技术栈。下面我列举一些我认为是让这个库“成功”的一些关键点。
- 初始版本基于 rusqlite 开发。因为我也是一个 rust 初学者,之前只拿 rust 做过一个项目,这是第二次使用 rust。基于 rustqlite 这样一个成熟的仓库做改造,能让我很快得到一个可用的版本,快速建立信心;另外整个程序的组织,API 的设计都已经经过了验证,不容易走弯路;整体的代码质量也能有基本保障。
- 基于 arrow 格式来交换数据。arrow 现在基本上算是列存储的数据交换标准,在很多开源项目中都有使用,duckdb 对 arrow 的支持也比较完善。虽然 duckdb 有自己的原生 C 接口,但是基于 arrow 格式来做数据交换,能让 rust 和 c-api 调用相对稳定,不会因为 duckdb 迭代导致 C 接口的变更,我们也需要一直变更,一定程度上减轻了维护的工作量,也减少了接口变更对用户的影响。
- 完善的 CI 流程,我认为所有的开源项目都应该要做到这一点。因为继承自 rusqlite,这个库从一开始就有 CI 流程,能保证合并到 master 的代码是没问题的,并且 CI 里面还有关于内存泄漏的检测,避免了 ffi 带了的可能不安全的问题。发布过程也是自动化的,只要打个 tag 就自动发布到 crate。CI 的机制保障了任何感兴趣的人都可以提交 MR 并得到检验,也保证自己如果长时间不维护了不至于都不知道从哪里开始改。
几个 MR
下面我挑选几个我认为比较关键的,并且不是我贡献的 MR: