80·常用生态进阶

数据库 ORM 与 SQLx

数据库 ORM 与 SQLx

学习目标

  1. 了解 Diesel ORM 基本用法
  2. 了解 SQLx 原生查询
  3. 理解编译时 vs 运行时检查

核心概念

SQLx(编译时检查 SQL)

[dependencies]
sqlx = { version = "0.8", features = ["runtime-tokio", "sqlite"] }
tokio = { version = "1", features = ["full"] }
use sqlx::sqlite::SqlitePool;

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    let pool = SqlitePool::connect("sqlite:mydb.db").await?;

    // 创建表
    sqlx::query("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
        .execute(&pool)
        .await?;

    // 插入
    sqlx::query("INSERT INTO users (name, age) VALUES (?, ?)")
        .bind("Alice")
        .bind(30)
        .execute(&pool)
        .await?;

    // 查询
    let rows: Vec<(i64, String, i64)> = sqlx::query_as("SELECT id, name, age FROM users")
        .fetch_all(&pool)
        .await?;

    for (id, name, age) in rows {
        println!("{}: {} ({})", id, name, age);
    }

    Ok(())
}

compile-time checked queries

// sqlx 可以在编译时检查 SQL 语法和类型
// 需要 DATABASE_URL 环境变量

// #[derive(FromRow)]
// struct User {
//     id: i64,
//     name: String,
//     age: i32,
// }
//
// let users = sqlx::query_as!(User, "SELECT * FROM users WHERE age > ?", 25)
//     .fetch_all(&pool)
//     .await?;

Diesel ORM

[dependencies]
diesel = { version = "2", features = ["sqlite"] }
// schema.rs (自动生成)
// table! {
//     users (id) {
//         id -> Integer,
//         name -> Text,
//         age -> Integer,
//     }
// }

// models.rs
#[derive(Queryable, Insertable)]
#[diesel(table_name = users)]
struct User {
    id: i32,
    name: String,
    age: i32,
}

小结

工具特点
SQLx原生 SQL,编译时检查,异步
DieselORM,类型安全,查询构建器

练习编辑器

rust
Loading...