新闻详情

新闻详情

首页 / 资讯中心 / 详情

sea-orm修改部分字段

发布时间:2026/9/28 21:25:18来源:尧图网络
sea-orm修改部分字段
在 SeaORM 中修改部分字段核心在于利用 ActiveModel 的 ActiveValue 状态系统。你只需将需要修改的字段设置为 Set其他字段保持为 Unchanged 或 NotSet生成的 SQL 就只会包含你设置的那些列。### 方法一通过 ActiveModel 更新单条记录这是最常用的方式适用于已知主键、需要更新特定字段的场景。**步骤**1. 根据主键查询记录获得 Model。2. 将 Model 转换为 ActiveModel此时所有字段状态为 Unchanged。3. 将需要修改的字段设置为 Set(新值)。4. 调用 update(db) 方法。**示例** 更新水果的名称为 Sweet pear其他字段不变。rustuse sea_orm::{entity::*, query::*, DbConn};use sea_orm::ActiveValue::Set;// 1. 查询记录let pear: Optionfruit::Model Fruit::find_by_id(28).one(db).await?;let pear pear.unwrap();// 2. 转换为 ActiveModel (所有字段变为 Unchanged)let mut pear: fruit::ActiveModel pear.into();// 3. 只修改 name 字段pear.name Set(Sweet pear.to_owned());// 4. 执行更新// 生成的 SQL: UPDATE fruit SET name Sweet pear WHERE id 28let pear: fruit::Model pear.update(db).await?;关键点update 方法会根据主键自动生成 WHERE 条件并且只更新状态为 Set 的字段。### 方法二使用 update_many 进行批量条件更新如果你需要根据条件更新多条记录且不想逐条查询可以使用 Entity::update_many() 构建器。**方式 A使用 col_expr 直接设置列值**rustuse sea_orm::{entity::*, query::*, DbConn};// 将所有名称包含 Apple 的记录cake_id 设为 1// SQL: UPDATE fruit SET cake_id 1 WHERE fruit.name LIKE %Apple%Fruit::update_many().col_expr(fruit::Column::CakeId, Expr::value(1)).filter(fruit::Column::Name.contains(Apple)).exec(db).await?;这种方式直接指定列和值适合简单的字段赋值。**方式 B使用 set 方法传入 ActiveModel**你也可以构建一个只设置了部分字段的 ActiveModel然后通过 .set() 传给 update_many。rustuse sea_orm::ActiveValue::Set;let partial_update fruit::ActiveModel {name: Set(Updated Apple.to_owned()),..Default::default() // 其他字段为 NotSet不会被更新};Fruit::update_many().set(partial_update).filter(fruit::Column::Id.eq(1)).exec(db).await?;使用 ..Default::default() 可以确保未指定的字段状态为 NotSet从而不会被包含在 SET 子句中。### 方法三使用 DerivePartialModelSeaORM 2.0SeaORM 2.0 引入了 DerivePartialModel它允许你定义只包含部分字段的结构体并可以将其转换为 ActiveModel 用于更新。对于只关心少数几个字段的场景这能显著简化代码。rustuse sea_orm::DerivePartialModel;#[derive(DerivePartialModel)]#[sea_orm(entity fruit::Entity, into_active_model)]struct FruitNameUpdate {id: i32,name: String,}let partial FruitNameUpdate {id: 28,name: Lemon Drizzle.to_owned(),};let active_model: fruit::ActiveModel partial.into_active_model();// 此时只有 id 和 name 是 Set 状态其他字段为 NotSet之后你可以用这个 ActiveModel 去执行更新。未包含在 PartialModel 中的属性会自动填充为 NotSet这在构建部分更新时非常有用。### 补充强制更新未修改的字段有时你需要强制更新某个字段即使它的值没有变化。可以使用 reset 或 reset_all 方法rustlet mut pear: fruit::ActiveModel pear.into();pear.name Set(Sweet pear.to_owned());// 强制更新 cake_id 字段pear.reset(fruit::Column::CakeId);// 或者强制更新所有字段// pear.reset_all();// SQL: UPDATE fruit SET name Sweet pear, cake_id 10 WHERE id 28pear.update(db).await?;reset 会将指定列的 Unchanged 状态转为 Set使其被包含在 UPDATE 语句中。### 总结| 场景 | 推荐方法 | 关键操作 || :--- | :--- | :--- || **更新单条记录的部分字段** | ActiveModel update | 将 Model 转为 ActiveModel修改字段为 Set || **根据条件批量更新** | update_many col_expr | 直接指定列和值配合 filter || **批量更新且只设置部分列** | update_many set(ActiveModel) | 构建部分设置的 ActiveModel用 ..Default::default() || **SeaORM 2.0 简化部分更新** | DerivePartialModel | 定义部分结构体into_active_model 后更新 || **强制更新未修改字段** | reset 或 reset_all | 将 Unchanged 状态转为 Set |核心原则是**只有状态为 Set 的字段才会出现在 UPDATE 的 SET 子句中**利用好 ActiveValue 的状态机制就能精准控制部分更新。
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

真实废弃物分类数据集实战:4,800张图从训练到部署 2026/9/28 22:22:11

真实废弃物分类数据集实战:4,800张图从训练到部署

简介:本资源为面向计算机视觉初学者与图像分类实践者的真实废弃物图像分类数据集,覆盖纸板、食品有机物、玻璃、金属、杂项垃圾、纸张、塑料、纺织品垃圾和植被共9个类别,适合用于分类网络训练、迁移学习验证及垃圾分类相关课程设计。数据已完…

阅读更多 →
Altium Designer晶振铺铜挖空设计原理与实操 2026/9/28 22:21:49

Altium Designer晶振铺铜挖空设计原理与实操

1. 这不是“填铜”而是“控铜”:晶振区域铺铜的本质矛盾与破局逻辑Altium Designer里画多边形铺铜,很多人以为只是把空白区域“填满”——这恰恰是导致晶振电路失效、EMI超标、起振失败的根源。我带过三届硬件新人,90%的人第一次做STM32H743Z…

阅读更多 →
Superpowers 实战:为 AI 编程助手注入技能包与四阶段工作流 2026/9/28 22:21:42

Superpowers 实战:为 AI 编程助手注入技能包与四阶段工作流

做开发这么多年,我越来越相信一件事:工具本身不产生价值,用工具的习惯才产生价值。superpowers 这个名字听起来像游戏外挂,实际上是一套围绕 AI 编程助手设计的技能增强方案。它不是要替代 Codex 这类智能体,而是给它们…

阅读更多 →
Superpowers技能包:让AI编程Agent输出质量更稳的实战指南 2026/9/28 22:21:35

Superpowers技能包:让AI编程Agent输出质量更稳的实战指南

superpowers 这个名字第一次看到时,我以为是某个效率玄学工具,直到在 Codex 工作流里真正连续用了一周,才确认它并不是包装出来的概念,而是真的能把 AI 编程 Agent 的产出质量往前推一截的东西。它不是脚手架,也不是&q…

阅读更多 →
基于PaddleOCR的车牌识别算法:从检测到识别的全流程实战与优化 2026/9/28 22:21:08

基于PaddleOCR的车牌识别算法:从检测到识别的全流程实战与优化

简介:本资源面向计算机视觉初学者与进阶开发者,提供一套基于PaddleOCR的车牌识别完整项目源码,帮助读者从零搭建可运行的车牌检测与识别系统,解决车牌定位、字符识别及模型部署等实际问题。压缩包共416个文件,约37MB&a…

阅读更多 →
Python深度学习人脸识别系统毕业设计:从CNN选型到答辩演示全链路 2026/9/28 22:21:08

Python深度学习人脸识别系统毕业设计:从CNN选型到答辩演示全链路

简介:这份资源面向高校学生与深度学习入门者,提供一套基于Python的人脸识别系统完整毕业设计实现,涵盖代码、模型与文档说明,可用于毕业设计、课程设计或期末大作业。项目采用深度学习方案,涉及FER2013、CK、JAFFE等公…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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