探索 Rust 的 ORM 庫
ORM 代表對象關係映射。它是一種編程技術,彌補了面向對象編程語言和關係數據庫之間的差距。簡單地說,orm 允許我們使用語言的原生語法操作數據庫記錄,避免了編寫原始 SQL 的需要。這不僅使我們的代碼更乾淨,而且還確保了類型安全並減少了運行時錯誤。
在這篇文章中我們將深入 Rust 的對象關係映射 (ORM) 世界,重點關注 Diesel、SQLx 和 rusqlite。
Diesel
Diesel 是一個強大的用於 Rust 的 ORM 和查詢構建器,它強調安全性和易用性。以下是 Diesel 脫穎而出的原因:
-
類型安全:Diesel 確保在編譯時對 SQL 查詢進行類型檢查,從而顯著減少運行時錯誤。
-
可擴展性:通過高級 API,Diesel 可以輕鬆的管理模式和構建查詢。
-
多數據庫支持:Diesel 支持 PostgreSQL、SQLite 和 MySQL,使其適用於各種應用程序。使用 Diesel,可以無需手動管理數據庫連接。它會幫你解決這些問題,讓你專注於真正重要的事情——構建出色的應用程序!
#[macro_use]
extern crate diesel;
use diesel::prelude::*;
use diesel::pg::PgConnection;
fn establish_connection() -> PgConnection {
let database_url = "postgres://username:password@localhost/mydb";
PgConnection::establish(&database_url)
.expect(&format!("Error connecting to {}", database_url))
}
SQLx:異步 sql
SQLx 是一個異步的純 rust 編寫的 SQL 工具包和 ORM,它既強大又靈活。以下是它的一些主要特性:
-
異步支持:SQLx 在構建時考慮了異步編程,因此非常適合高性能應用程序。
-
編譯時檢查:SQLx 在編譯時檢查 SQL 查詢,確保它們是正確的並減少運行時錯誤。
-
廣泛的數據庫支持:SQLx 支持 PostgreSQL, MySQL, SQLite 和 MSSQL。
SQLx 的異步特性,加上其健壯的類型系統,使其成爲現代 Rust 應用程序的絕佳選擇。
use sqlx::postgres::PgPoolOptions;
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
let pool = PgPoolOptions::new()
.max_connections(5)
.connect("postgres://username:password@localhost/mydb")
.await?;
let row: (i64,) = sqlx::query_as("SELECT COUNT(*) FROM users")
.fetch_one(&pool)
.await?;
println!("Number of users: {}", row.0);
Ok(())
}
rusqlite
rusqlite 是一個輕量級的符合人體工程學的庫,用於在 Rust 中與 SQLite 數據庫進行交互。以下是 rusqlite 很棒的原因:
-
簡單:rusqlite 的設計是直接的和易於使用的,使其完美的適合中小型應用程序。
-
Serde 集成:它與 Serde crate 無縫集成,允許數據的類型可以安全的序列化和反序列化。
-
效率:圍繞 sqlite3 C 庫構建,rusqlite 以最小的開銷提供高效的數據庫操作。
rusqlite 非常適合只需要簡單可靠的數據庫解決方案,而不需要複雜性的 ORM 框架的應用程序。
use rusqlite::{params, Connection, Result};
fn main() -> Result<()> {
let conn = Connection::open("mydb.db")?;
conn.execute(
"CREATE TABLE IF NOT EXISTS user (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER
)",
[],
)?;
conn.execute(
"INSERT INTO user (name, age) VALUES (?1, ?2)",
params!["Alice", 30],
)?;
let mut stmt = conn.prepare("SELECT id, name, age FROM user")?;
let user_iter = stmt.query_map([], |row| {
Ok(User {
id: row.get(0)?,
name: row.get(1)?,
age: row.get(2)?,
})
})?;
for user in user_iter {
println!("Found user {:?}", user?);
}
Ok(())
}
#[derive(Debug)]
struct User {
id: i32,
name: String,
age: Option<i32>,
}
總結
Rust 的 ORM 生態系統是充滿活力和強大的,提供了滿足不同需求和偏好的工具:Diesel 的類型安全性和可擴展性、SQLx 的異步功能,rusqlite 的簡單性。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/SbdZxOiQkctwWEvlm9pjFw