Skip to main content

build_dynamic_update

Function build_dynamic_update 

Source
pub fn build_dynamic_update(
    dialect: &dyn Dialect,
    table: &str,
    pk_column: &str,
    pk_value: &Value,
    tracker: &DirtyTracker,
) -> Option<String>
Expand description

生成仅含脏字段的 UPDATE SQL(对应 Hibernate @DynamicUpdate

生成的 SQL 形如:

UPDATE `table` SET `col1` = ?, `col2` = ? WHERE `pk` = ?

§参数

  • dialect:数据库方言
  • table:表名
  • pk_column:主键列名
  • pk_value:主键值
  • tracker:脏字段追踪器

§返回

  • Some(sql):存在脏字段时返回 UPDATE SQL
  • None:无脏字段,无需更新

§示例

use sz_orm_model::dirty_attributes::{DirtyTracker, build_dynamic_update};
use sz_orm_model::{DbType, get_dialect, Value};
use std::collections::HashMap;

let dialect = get_dialect(DbType::MySQL).unwrap();
let mut row = 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);
tracker.set("age", Value::I64(26));

let sql = build_dynamic_update(&*dialect, "users", "id", &Value::I64(1), &tracker).unwrap();
assert!(sql.contains("UPDATE `users` SET"));
assert!(sql.contains("`age` = 26"));
assert!(!sql.contains("`name`")); // 未修改字段不出现