新闻详情

新闻详情

首页 / 资讯中心 / 详情

Sea-ORM 的增删改查

发布时间:2026/9/29 15:09:38来源:尧图网络
Sea-ORM 的增删改查
Sea-ORM 的增删改查主要围绕这几个概念Entity对应数据库表Model查询出来的完整记录ActiveModel用于插入、更新的数据载体ActiveValue::Set/NotSet控制哪些字段参与 SQL下面以users表为例。1. 定义实体use sea_orm::entity::prelude::*; #[derive(Clone, Debug, PartialEq, DeriveEntityModel)] #[sea_orm(table_name users)] pub struct Model { #[sea_orm(primary_key)] pub id: i32, pub name: String, pub email: String, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] pub enum Relation {} impl ActiveModelBehavior for ActiveModel {}假设这个模块叫user后面用user::Entity、user::Model、user::ActiveModel来操作。2. 增Create插入单条use sea_orm::ActiveValue::Set; let new_user user::ActiveModel { name: Set(张三.to_owned()), email: Set(zhangsanexample.com.to_owned()), ..Default::default() }; let result user::Entity::insert(new_user).exec(db).await?; // 如果是自增主键这里可以拿到插入后的 id let inserted_id result.last_insert_id;批量插入let users vec![ user::ActiveModel { name: Set(张三.to_owned()), email: Set(zhangsanexample.com.to_owned()), ..Default::default() }, user::ActiveModel { name: Set(李四.to_owned()), email: Set(lisiexample.com.to_owned()), ..Default::default() }, ]; user::Entity::insert_many(users).exec(db).await?;3. 查Read查询全部let users: Vecuser::Model user::Entity::find().all(db).await?;按主键查询let user: Optionuser::Model user::Entity::find_by_id(1).one(db).await?;条件查询let users user::Entity::find() .filter(user::Column::Name.eq(张三)) .all(db) .await?;模糊查询let users user::Entity::find() .filter(user::Column::Name.contains(张)) .all(db) .await?;分页查询let paginator user::Entity::find().paginate(db, 10); // 第 0 页 let page paginator.fetch_page(0).await?;4. 改Update更新单条记录的部分字段use sea_orm::ActiveValue::Set; let u user::Entity::find_by_id(1) .one(db) .await? .expect(user not found); // Model 转成 ActiveModel let mut active: user::ActiveModel u.into(); // 只修改 name active.name Set(李四.to_owned()); let updated active.update(db).await?;关键点只有被设置为Set(...)的字段才会进入UPDATE ... SET没有Set的字段不会更新批量条件更新use sea_orm::sea_query::Expr; user::Entity::update_many() .col_expr(user::Column::Email, Expr::value(newexample.com)) .filter(user::Column::Name.eq(张三)) .exec(db) .await?;也可以用set()let partial user::ActiveModel { email: Set(newexample.com.to_owned()), ..Default::default() }; user::Entity::update_many() .set(partial) .filter(user::Column::Id.eq(1)) .exec(db) .await?;5. 删Delete删除单条记录let u user::Entity::find_by_id(1) .one(db) .await? .expect(user not found); u.delete(db).await?;按条件批量删除user::Entity::delete_many() .filter(user::Column::Name.eq(张三)) .exec(db) .await?;按主键删除user::Entity::delete_by_id(1).exec(db).await?;6. 完整 CRUD 示例use sea_orm::*; use sea_orm::ActiveValue::Set; pub async fn create_user( db: DatabaseConnection, name: str, email: str, ) - Resulti32, DbErr { let model user::ActiveModel { name: Set(name.to_owned()), email: Set(email.to_owned()), ..Default::default() }; let res user::Entity::insert(model).exec(db).await?; Ok(res.last_insert_id) } pub async fn get_user( db: DatabaseConnection, id: i32, ) - ResultOptionuser::Model, DbErr { user::Entity::find_by_id(id).one(db).await } pub async fn update_user_name( db: DatabaseConnection, id: i32, new_name: str, ) - Resultuser::Model, DbErr { let u user::Entity::find_by_id(id) .one(db) .await? .ok_or(DbErr::RecordNotFound(user not found.to_owned()))?; let mut active: user::ActiveModel u.into(); active.name Set(new_name.to_owned()); active.update(db).await } pub async fn delete_user( db: DatabaseConnection, id: i32, ) - ResultDeleteResult, DbErr { user::Entity::delete_by_id(id).exec(db).await }常见注意点插入和更新都用ActiveModel插入构造ActiveModel更新通常先查出Model再转成ActiveModel只有Set的字段才会参与更新active.name Set(新名字.to_owned());批量操作优先用insert_many/update_many/delete_many不要循环单条操作性能会差很多。查询结果可能是OptionModelfind_by_id(...).one(db)返回的是Option生产代码里建议显式处理不要随便unwrap()。如果涉及多步操作建议用事务let txn db.begin().await?; // 在事务里执行增删改查 user::Entity::insert(model).exec(txn).await?; txn.commit().await?;需要我接着讲讲 Sea-ORM 的关联查询JOIN和事务使用吗
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

阿里云产品手册2025.pdf深度解读:从选型地图到成本看板的四步落地法 2026/9/29 16:13:37

阿里云产品手册2025.pdf深度解读:从选型地图到成本看板的四步落地法

简介:阿里云产品手册2025.pdf面向云计算从业者、企业架构师、开发者及技术选型人员,系统梳理阿里云全栈产品体系,帮助读者快速建立对云平台能力版图的整体认知,解决产品繁多、分类不清、选型困难等问题。资源为单个PDF文件&#x…

阅读更多 →
ARM汇编中BIC与CMP指令的硬件原理与实时优化 2026/9/29 16:13:37

ARM汇编中BIC与CMP指令的硬件原理与实时优化

1. 为什么BIC和CMP是ARM汇编里最常被低估的“组合拳” 在嵌入式开发、Linux内核裁剪、RTOS底层驱动优化,甚至Android HAL层性能调优的实际项目中,我见过太多人一上来就猛啃LDR/STR、跳转指令,却把BIC和CMP当成教科书里的“基础语法”草草略过…

阅读更多 →
高压DC-DC升压模块选型实战指南:从90V到900V的工程决策链 2026/9/29 16:13:37

高压DC-DC升压模块选型实战指南:从90V到900V的工程决策链

1. 为什么“升压模块选型”不是查参数表就能搞定的事?你手头有个传感器需要90V偏置电压,或者工业PLC的继电器驱动要200V直流,又或者某款新型光电编码器明确要求450V供电——这时候打开电商页面搜“DC-DC升压模块”,弹出上千个结果…

阅读更多 →
ARM汇编中BIC与CMP的协同原理与实战优化 2026/9/29 16:13:37

ARM汇编中BIC与CMP的协同原理与实战优化

1. 为什么BIC和CMP是ARM汇编里最常被低估的“组合拳” 在嵌入式开发、Linux内核驱动调试、RTOS底层优化这些真实场景里,我见过太多人把BIC和CMP当成教科书里的“基础指令”匆匆略过——直到某天在性能瓶颈分析中卡死三天,才发现问题出在一条没被重视的BI…

阅读更多 →
栈的三大经典应用:括号匹配、相邻消除与逆波兰表达式求值 2026/9/29 16:13:31

栈的三大经典应用:括号匹配、相邻消除与逆波兰表达式求值

刷算法题刷到代码随想录day11的栈与队列part2,也就是20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值这三道经典题时,我最大的感受是:栈终于开始干正事了。前面part1用栈实现队列、用队列实现栈,更多是结…

阅读更多 →
Linux服务器MySQL自动备份:crontab+mysqldump实战方案 2026/9/29 16:13:30

Linux服务器MySQL自动备份:crontab+mysqldump实战方案

很多人觉得备份是“有空再说”的事,直到某天误删了一张业务表、服务器磁盘突然报废,或者被同事一条 DROP DATABASE 直接清库,才追悔莫及。尤其是Linux服务器上的MySQL,很多人平时连ssh都懒得登,更别说天天盯着数据了…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉