sqlx是一个Rust SQL工具包:让SQL在编译时验证检查


SQLx是一个异步的、纯Rust†的SQL工具箱,具有编译时检查SQL查询的功能,无需DSL。

  • 跨平台:作为原生 Rust,SQLx 将在任何支持 Rust 的地方编译。
  • 内置连接池与sqlx::Pool.
  • 行流式传输。数据从数据库异步读取并按需解码。
  • 自动语句准备和缓存。使用高级查询 API ( sqlx::query) 时,会为每个连接准备和缓存语句。
  • 简单(未准备)查询执行,包括将结果提取到Row高级 API 使用的相同类型。支持批量执行并返回所有语句的结果。
  • 支持的传输层安全性 (TLS)(MySQLPostgreSQL)。
  • 支持保存点的嵌套事务。
  • 真正的异步。使用 async/await 从头开始​​构建以实现最大并发性。
  • 支持数据库:PostgreSQL, MySQL, SQLite, 和 MSSQL.。
  • 纯Rust。Postgres 和 MySQL/MariaDB 驱动程序是用纯 Rust 编写的,无不安全unsafe代码。
  • 运行时不可知论:适用于不同的运行时 ( async-stdtokioactix) 和 TLS 后端 ( native-tlsrustls)。

 
SQLx 不是 ORM!
SQLx支持编译时检查的查询。然而,它不是通过提供Rust API或DSL(特定领域的语言)来构建查询。相反,它提供了一些宏,将常规SQL作为输入,并确保它对你的数据库有效。
其工作方式是,SQLx在编译时连接到你的开发数据库,让数据库本身验证(并返回一些信息)你的SQL查询。这有一些潜在的令人惊讶的影响。
  • 由于SQLx从来不需要解析SQL字符串本身,任何开发数据库接受的语法都可以使用(包括由数据库扩展添加的东西)。
  • 由于数据库让你检索到的关于查询的信息量不同,你从查询宏中得到的SQL验证程度取决于数据库

如果你正在寻找一个(异步的)ORM,你可以查看ormx或SeaORM,它是建立在SQLx之上的。
 
案例代码:
// provides `try_next`
use futures::TryStreamExt;

let mut rows = sqlx::query(
"SELECT * FROM users WHERE email = ?")
    .bind(email)
    .fetch(&mut conn);

while let Some(row) = rows.try_next().await? {
   
// map the row into a user-defined domain type
    let email: &str = row.try_get(
"email")?;
}
 

我们可以使用宏sqlx::query!来实现对SQL的编译时语法和语义验证,输出到一个匿名的记录类型,其中每个SQL列是一个Rust字段(在需要时使用原始标识符)。

let countries = sqlx::query!(
        "
SELECT country, COUNT(*) as count
FROM users
GROUP BY country
WHERE organization = ?
       
",
        organization
    )
    .fetch_all(&pool)
// -> Vec<{ country: String, count: i64 }>
    .await?;

// countries[0].country
// countries[0].count