肖恩·M·托马斯:PG星期五:我的Postgres有点Rusty
内容提要
Postgres和Rust在Postgres世界中的应用越来越多,特别是得益于PGRX项目的贡献。使用Rust与Postgres交互有很多方式,作者选择了sqlx库。通过一些实验,作者发现还需要其他一些crate。连接数据库和执行SQL语句都相对简单。Rust代码相对复杂,但连接数据库、插入记录和查询记录都比较直观。作者提到了一些未来的改进方向,如使用线程池、创建API和REST接口等。
延伸解读
Rust 驱动不依赖 libpq 的取舍
文章指出,Rust 的 Postgres 驱动是从头编写的,不链接 libpq 库。这带来一个实际限制:无法使用 .pgpass 文件,因此连接字符串中必须包含密码。对于习惯 libpq 生态的开发者,这意味着需要调整连接配置方式,并注意密码管理。同时,这也解释了为何某些 libpq 功能在 Rust 驱动中可能缺失,选择时需权衡。
sqlx 迁移与版本控制的结合
作者强调 sqlx 的迁移功能与源代码控制配合得很好。通过 sqlx migrate add 生成新的 SQL 文件,每次模式变更都成为可追踪的迁移脚本。在新环境中运行 sqlx migrate run 会按顺序应用所有迁移,便于早期发现问题。这种工作流将数据库模式变更纳入版本管理,减少了环境差异带来的意外。
显式事务减少插入开销
在插入 100 条模拟传感器记录时,作者选择显式开启事务,而不是逐条执行。因为每条独立语句会创建隐式事务,显式事务能显著降低开销。代码中通过 pool.begin() 获取事务对象,循环执行插入后统一提交。此外,作者使用 Local::now() 而非 SQL 的 now(),因为后者固定在事务开始时间,可能不够准确。
当前演示的局限与后续方向
文章明确这是一次基础探索,仅覆盖连接、插入和查询,没有涉及更新、删除、函数调用或触发器。作者提出未来可改进的方向:使用线程池让连接池服务多线程、创建专用 API 和 REST 接口、将功能拆分为独立函数和 crate,甚至尝试用 PGRX 编写 Postgres 扩展。这些方向为读者提供了继续深入学习的路径。
Q&A
Postgres和Rust结合的主要优势是什么?
Postgres和Rust的结合得益于PGRX项目的贡献,提供了更高效的数据库交互方式。
作者选择使用哪个库与Postgres交互?
作者选择使用sqlx库与Postgres交互。
在使用Rust连接Postgres时需要注意什么?
Rust的Postgres驱动程序是从头编写的,不依赖libpq库,因此某些功能可能缺失,如使用.pgpass文件。
如何管理数据库模式?
可以使用sqlx的迁移功能来管理数据库模式,通过命令行工具执行SQL迁移。
作者提到的未来改进方向有哪些?
未来的改进方向包括使用线程池、创建API和REST接口等。
Rust代码在连接数据库时的复杂性如何?
Rust代码相对复杂,但连接数据库、插入记录和查询记录的过程较为直观。