数据库 ORM 与 SQLx
学习目标
- 了解 Diesel ORM 基本用法
- 了解 SQLx 原生查询
- 理解编译时 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,编译时检查,异步 |
| Diesel | ORM,类型安全,查询构建器 |
练习编辑器
rust
Loading...