Rust 异步 ORM 新选择:Toasty 初探
Rust 异步 ORM 新选择Toasty 初探2026年4月Rust 生态迎来了一款新异步 ORM 框架 Toasty。为什么它如此收到 Rust 开发者的广泛关注呢因为它是来自于鼎鼎大名的 Tokio 团队该团队研发的 tokio异步运行时、tracing日志库、prost(pb 库)、axum(Web 框架)、loom(并发测试库) 等等在 Rust 开发中都是必备的库之一。本文将从初探的角度带着大家快速认识这款新框架。Toasty 介绍Toasty 是一个面向 Rust 编程语言的 ORM它以易用性为首要目标。目前它支持 SQL 数据库SQLite、PostgreSQL、MySQL和 NoSQL 数据库DynamoDB。Toasty 不会消除数据库的特性而是可以通过 feature 引入相应数据库的特性。与其他 ORM 不同Toasty 并非单纯的“SQL 生成工具”而是定位为“应用级查询引擎”核心设计理念是让应用层 schema 与数据库 schema 完全解耦将高层查询转换为不同数据库查询的最佳实践同时简化 API 设计减少 Rust 特性如 trait、生命周期的复杂使用降低上手门槛。需要注意的是当前 Toasty 是处于预览版状态大部分主要功能已经实现功能足够完整可以用于构建应用程序但是 API 尚未稳定未来仍可能存在破坏性变更不推荐用于严谨的项目。快速入门这个示例将带你创建项目、定义模型以及运行第一个查询。创建一个新项目cargonew toasty-democdtoasty-demo在Cargo.toml文件中添加以下依赖项[dependencies] toasty { version 0.3, features [sqlite] } tokio { version 1, features [full] }sqlitefeature 会启用 SQLite 驱动器。Toasty 还支持postgresql、mysql和dynamodb在 features 中添加以使用不同的数据库。定义模型编辑src/main.rs并添加以下内容// 模型#[derive(Debug, toasty::Model)]structUser{#[key]#[auto]id:u64,name:String,#[unique]email:String,}#[tokio::main]asyncfnmain()-toasty::Result(){// 构建 DB 处理器并注册当前 crate 下的所有模型letmutdbtoasty::Db::builder().models(toasty::models!(crate::*)).connect(sqlite::memory:).await?;// 基于模型创建数据表db.push_schema().await?;// 插入用户数据letusertoasty::create!(User{name:Alice,email:aliceexample.com,}).exec(mutdb).await?;println!(Created: {:?},user.name);// 通过主键 ID 查询用户数据letfoundUser::get_by_id(mutdb,user.id).await?;println!(Found: {:?},found.email);Ok(())}运行它cargorun你就能看到Created: Alice Found: aliceexample.comCURD 操作创建记录// 使用宏letusertoasty::create!(User{name:Alice,email:aliceexample.com,}).exec(mutdb).await?;// 链式操作letuserUser::create().name(Alice).email(aliceexample.com).exec(mutdb).await?;// 批量插入letuserstoasty::create!(User::[{name:Alice,email:aliceexample.com},{name:Bob,email:bobexample.com},{name:Carol,email:carolexample.com},]).exec(mutdb).await?;查询记录// 通过主键获取单条记录letuserUser::get_by_id(mutdb,1).await?;println!(Found: {},user.name);// 获取所有记录letusersUser::all().exec(mutdb).await?;println!(Found: {:?},users);// 使用表达式进行条件查询letusersUser::filter(User::fields().name().eq(Alice)).exec(mutdb).await?;// 使用链式表达式进行条件查询letusersUser::filter_by_name(Alice).filter(User::fields().age().gt(25)).exec(mutdb).await?;这里 Toasty 构建一套fields()、gt()等 API 的查询语法其实是为了抹平 SQL 与 NoSQL 的语法差异确保能正确转换到对应的数据库查询。更新记录user.update().name(Alice Smith).email(alice.smithexample.com).exec(mutdb).await?;// 通过查询更新User::filter_by_id(user_id).update().name(Bob).exec(mutdb).await?;删除记录user.delete().exec(mutdb).await?;// 基于主键删除记录User::delete_by_id(mutdb,user.id).await?;// 通过查询删除记录User::filter_by_email(aliceexample.com).delete().exec(mutdb).await?;事务操作letmuttxdb.transaction().await?;toasty::create!(User{name:Alice}).exec(muttx).await?;toasty::create!(User{name:Bob}).exec(muttx).await?;tx.commit().await?;总结总得来说Toasty 还是蛮有野心的与其他的 ORM 框架不同只关注于关系型数据库Toasty 想要的是整合关系型数据库与非关系型数据库提供一致性的访问 API。不过毕竟 Toasty 才刚起步生态还处于建设当中可以先持续关注着未来可期。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2502401.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!