探索 Rust 的 ORM 庫

ORM 代表對象關係映射。它是一種編程技術,彌補了面向對象編程語言和關係數據庫之間的差距。簡單地說,orm 允許我們使用語言的原生語法操作數據庫記錄,避免了編寫原始 SQL 的需要。這不僅使我們的代碼更乾淨,而且還確保了類型安全並減少了運行時錯誤。

在這篇文章中我們將深入 Rust 的對象關係映射 (ORM) 世界,重點關注 Diesel、SQLx 和 rusqlite。

Diesel

Diesel 是一個強大的用於 Rust 的 ORM 和查詢構建器,它強調安全性和易用性。以下是 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 的異步特性,加上其健壯的類型系統,使其成爲現代 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 非常適合只需要簡單可靠的數據庫解決方案,而不需要複雜性的 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