use torm::{Database, Model, Query};
#[derive(Debug, Clone, Model)]
#[model(table_name = "users")]
pub struct User {
pub id: i64,
pub name: String,
pub email: String,
pub age: i32,
}
impl User {
fn new(name: &str, email: &str, age: i32) -> Self {
Self {
id: 0, name: name.to_string(),
email: email.to_string(),
age,
}
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let db = Database::sqlite(":memory:").await?;
db.auto_migrate::<User>().await?;
println!("表 users 已自动创建\n");
println!("=== 1. Insert (自增主键自动回填) ===");
let mut alice = User::new("Alice", "alice@example.com", 25);
db.create(&mut alice).await?;
let mut bob = User::new("Bob", "bob@example.com", 17);
db.create(&mut bob).await?;
let mut carol = User::new("Carol", "carol@example.com", 30);
db.create(&mut carol).await?;
println!(
" id 自动分配: Alice={} Bob={} Carol={}\n",
alice.id, bob.id, carol.id
);
println!("=== 2. Query (自动映射回 User) ===");
let adults: Vec<User> = Query::new("users")
.where_gte("age", 18)
.order_by_desc("age")
.query(&db)
.models::<User>()
.await?;
for u in &adults {
println!(" id={} name={} email={} age={}", u.id, u.name, u.email, u.age);
}
let first_two: Vec<User> = Query::new("users")
.where_gt("age", 0)
.order_by_asc("id")
.limit(2)
.query(&db)
.models::<User>()
.await?;
println!(" 前 2 条: {:?}", first_two.iter().map(|u| &u.name).collect::<Vec<_>>());
println!();
println!("=== 3. Update ===");
let affected = db.update(&mut alice, &[("age", 26)]).await?;
println!(" 更新 age 影响 {} 行", affected);
db.update(
&mut alice,
&[("email", "alice_new@example.com"), ("name", "Alice A.")],
)
.await?;
let refreshed: User = db.first::<User>(&alice.id.to_string()).await?.unwrap();
println!(
" 更新后: name={} age={} email={}\n",
refreshed.name, refreshed.age, refreshed.email
);
println!("=== 4. Delete ===");
let removed = db.delete(&mut bob).await?;
println!(" 删除 Bob 影响 {} 行", removed);
let remaining = db.all::<User>().await?;
println!(" 剩余 {} 条: {:?}", remaining.len(), remaining.iter().map(|u| &u.name).collect::<Vec<_>>());
println!("\n✅ insert / query / update / delete 全程零 SqlValue,Dapper 风格完成!");
Ok(())
}