launchbadge/sqlx: Rust SQL工具包讓SQL在編譯時驗證檢查

banq發表於2022-02-25

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

 

相關文章