Skip to main content

Module dirty_attributes

Module dirty_attributes 

Source
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§

DirtyTracker
脏字段追踪器

Functions§

build_dynamic_insert
生成仅含非 null 字段的 INSERT SQL(对应 Hibernate @DynamicInsert
build_dynamic_update
生成仅含脏字段的 UPDATE SQL(对应 Hibernate @DynamicUpdate