pub struct UpsertSpec {
pub table: &'static str,
pub rows: Vec<Row>,
pub conflict_key: Option<&'static str>,
pub exclude_from_update: Vec<&'static str>,
pub update_guard: Option<UpsertGuard>,
pub version_column: Option<&'static str>,
}Expand description
BatchUpsert 规格
§MAJ-5 修复
table 和 conflict_key 改为 &'static str,消除热路径的运行时 String 分配。
表名和冲突键都是编译期已知的常量(示例 “message”、“temporary_id”——core 不解释含义),
"message".to_string() 每次消息落库都产生一次堆分配,改为静态引用零成本。
注意:conflict_key 的具体值(如 "temporary_id")由 ACL-1 在 helix-im 侧提供,
helix-core 只传递字符串,不理解其含义。
Fields§
§table: &'static str目标表名(编译期常量,如 “message”)
rows: Vec<Row>§conflict_key: Option<&'static str>ON CONFLICT 的列名(如 ACL-1 提供 “temporary_id”;core 不知道含义)
exclude_from_update: Vec<&'static str>冲突时不更新的列(INSERT 仍写其字面值,ON CONFLICT DO UPDATE 排除它们)。
用途:守卫列 / 本地维护列——新行用提供的字面值,但已存在的行保留既有值 (“server 缺省 → 回退本地“语义在 upsert 层表达,无需先读后写)。列名编译期常量, driver 不解释含义(守 HX-C001)。空 = 旧行为(除 conflict_key 外全列更新)。
默认空:用 UpsertSpec::new(...) 构造可零改动迁移既有调用方。
update_guard: Option<UpsertGuard>可选的冲突行更新守卫;仅原行该列 IS expected 时允许 DO UPDATE。
守卫值走绑定参数,不进入 SQL 文本。缺行时仍按普通 INSERT 处理,因此调用方可用
SqlValue::Null 表达“没有旧版本”的并发插入守卫。带守卫的规格只允许一个 row。
version_column: Option<&'static str>Optional orderable column: skip conflicting rows whose stored version is greater. Values must have a consistent SQL type; missing/NULL stored versions admit initialization. With an update_guard, a skipped row instead returns a conflict and rolls back the transaction.
Implementations§
Trait Implementations§
Source§impl Clone for UpsertSpec
impl Clone for UpsertSpec
Source§fn clone(&self) -> UpsertSpec
fn clone(&self) -> UpsertSpec
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more