首选工具:Rust语言项目与PostgreSQL的完美交互

发表时间: 2022-04-18 11:35

当前,在Rust项目中与PostgreSQL交互时,有三个主要首选目标:

  • tokio-postgres
  • sqlx
  • Diesel

此三项均广受欢迎,已被很多网站与产品采用,在商用中占有相当大的份额。 如果是您会选哪一个?
我们来根据三个条件进行对比

  • 编译时安全
  • SQL VS DSL
  • 异步 VS 同步

编译时安全与关系数据库交互时很容易出错,例如:

  • 查询中列(column)或表(table)名称拼写错误
  • 执行操作被数据库引擎拒绝(将一个字符串和一个数字相加或在错误的列上连接两个表)
  • 返回的数据中有一个实际上不存在的字段

最主要的问题是,我们不知不觉中什么时候弄错也不知道。

在使用tokio-postgres时与大多数编程语言一样会发生这样的情况;在运行时我们试着查询而被数据库拒绝,此时我们将看到出错或异常。

Dieselsqlx通过在编译时检测大多数所提这些错误来加快反馈周期。Diesel利用其CLI将数据库模式表示生成为Rust代码,然后预设用于检查所有查询。

相反,sqlx使用程序宏在编译时连接到数据库并检查所提供查询是否正确。

查询接口

tokio-postgressqlx都希望您直接使用SQL来编写查询。

相反,Diesel提供了自己的查询构建器:查询为Rust类型,您可以通过调用其方法来添加过滤器、执行连接和类似操作。 也就是使用的领域特定语言(DSL)。

那么,哪个好?得看情况而定!

SQL具有极高的可移植性:您可以在任何需要与关系数据库交互的项目中使用而无需考虑编程语言或编写应用程序框架。

Diesel DSL与之相反,您需要花更多时间来熟悉并将其掌握而与之相关的项目都必须得使用它,就是:要么一条道走到黑,要么坚持从黑暗走向黎明!

值得注意的是;使用Diesel DSL表达复杂的查询有时候会很难实现而让您不得不编写原生的SQL

另一方面,Diesel DSL编写可重复使用组件变得更容易:您可以将复杂的查询拆分为更小的单元,并在多个地方加以利用,就像使用普通的Rust函数一样。

异步支持

有一个说辞让在下尤为认可,或多或少有种提升想法的感觉:“线程用于并行,异步用于等待并行!”。

您的数据库不在同一物理机上应用程序旁边:要运行查询,您必须执行网络调用。
异步数据库驱动程序不会减少处理单个查询所需时间,但它将使您的应用程序能够利用所有
CPU来执行其他工作(例如: 支持另一个HTTP请求)同时等待数据库返回结果。
那么异步是不是更好?这取决于您的应用程序对性能的要求。

一般来说,在单独线程池上运行查询应该绰绰有余。同时,如果您的Web框架已为异步,那么使用异步数据库驱动程序实际上会减少您的麻烦。
sqlxtokio-postgres都使用异步接口,而Diesel使用同步。

还值得一提的是,tokio-postgres是目前唯一支持流水线式查询,该功能sqlx仍处于设计阶段,而Diesel没有这方面与之相关的信息。

应用名称

编译时安全

查询接口

异步

tokio-postgres

SQL

sqlx

SQL

Diesel

DSL

对比已出,自己选吧!目前我的选择是sqlx, 但客户要求使用Diesel多一些,tokio-postgres测试中使用过,没有在产品中真正实践过。