Expand description
脏字段追踪(Dirty Attributes)+ @DynamicInsert / @DynamicUpdate
对应文档 6.8 节改进项 24(Dirty Attributes 脏字段追踪)+ 48(@DynamicInsert/@DynamicUpdate)。
§核心概念
- DirtyTracker:追踪字段变更状态(原始值快照 vs 当前值),计算哪些字段被修改
- is_dirty():判断是否有脏字段
- get_dirty_fields():返回所有脏字段名
- mark_clean():将当前值重新作为基准(写入完成后调用)
- get_original():获取字段的原始值(写入失败回滚时使用)
- build_dynamic_update():仅生成脏字段的 UPDATE SQL(对应 Hibernate
@DynamicUpdate) - build_dynamic_insert():仅生成非 null 字段的 INSERT SQL(对应 Hibernate
@DynamicInsert)
§设计灵感
- Hibernate
@DynamicInsert/@DynamicUpdate - Doctrine
ChangeTrackingPolicy::DEFERRED_EXPLICIT - Yii2
ActiveRecord::getDirtyAttributes() - Laravel Eloquent
getDirty()/getOriginal() - MyBatis-Plus
whereEntity仅含非 null 字段
§使用示例
use sz_orm_model::dirty_attributes::DirtyTracker;
use sz_orm_model::Value;
use std::collections::HashMap;
// 1. 加载用户后建立快照
let mut row: HashMap<String, Value> = HashMap::new();
row.insert("id".to_string(), Value::I64(1));
row.insert("name".to_string(), Value::String("alice".to_string()));
row.insert("age".to_string(), Value::I64(25));
let mut tracker = DirtyTracker::new(row);
// 2. 修改字段
tracker.set("age", Value::I64(26));
// 3. 检查脏字段
assert!(tracker.is_dirty());
assert_eq!(tracker.get_dirty_fields(), vec!["age"]);
assert_eq!(tracker.get_original("age"), Some(&Value::I64(25)));Structs§
- Dirty
Tracker - 脏字段追踪器
Functions§
- build_
dynamic_ insert - 生成仅含非 null 字段的 INSERT SQL(对应 Hibernate
@DynamicInsert) - build_
dynamic_ update - 生成仅含脏字段的 UPDATE SQL(对应 Hibernate
@DynamicUpdate)