XORM中需区分“彻底不映射”(xorm:"-”标签,编译期静态排除所有操作)与“临时跳过”(NoAutoCondition()、UseBool()等运行期动态控制),否则导致表同步失败或SQL列名错误。

在XORM中,实体结构体里存在既不参与数据库映射、又需保留在内存中使用的字段时,必须明确区分“彻底不映射”和“仅跳过当前操作”的语义,否则会触发表结构同步失败或SQL列名错误。
用结构体Tag彻底排除字段映射
这一步决定字段是否出现在建表语句和所有CRUD中。
在字段声明后添加 xorm:"-" 标签,XORM将完全忽略该字段——不会生成对应列,也不会在INSERT/UPDATE/SELECT中引用它。
例如: City CityTable `xorm:"-"` 表示嵌套结构体CityTable不映射为任何数据库字段,也不会触发级联查询。
注意:若该字段是基础类型(如string/int)且标记为 xorm:"-",则其值在Save()时不会写入数据库,但Get()后仍可读取原值——因为XORM根本不会碰它。
临时跳过字段参与当前SQL生成
适用于同一字段在不同场景下需切换映射行为,比如审计字段在批量导入时不更新CreatedTime。
方法一:调用NoAutoCondition()配合Where条件绕过自动赋值
执行 engine.NoAutoCondition().Insert(&user) 时,即使结构体中有 Created time.Time `xorm:"created"`,该字段也不会被自动设为当前时间,也不会出现在INSERT语句的字段列表中。
方法二:用UseBool()控制bool字段是否进入WHERE或SET子句
若结构体含 IsActive bool `xorm:"default true"`,默认XORM会跳过bool字段(因其非零即一),但加 UseBool("IsActive") 后,该字段就会作为查询或更新条件参与SQL构建。
【关键区别】 xorm:"-" 是编译期静态声明,影响所有操作;NoAutoCondition() 和 UseBool() 是运行期动态开关,只作用于当次会话。
区分不映射与临时字段的操作路径
第一步:确认字段用途——是永远不该进数据库(如日志上下文对象),还是仅某次操作暂不处理(如前端传来的校验标记)。
第二步:永久不映射 → 在结构体字段后加 `xorm:"-"`,并确保该字段不参与任何XORM自动生成逻辑(如Sync2建表、ID匹配查询)。
第三步:临时跳过 → 根据操作类型选择链式方法:
• 避免自动填充时间字段 → NoCache().NoAutoCondition()
• 强制bool字段参与条件 → UseBool("IsDraft")
• 禁用级联查询 → NoCascade()
第四步:验证效果——调用 engine.ShowSQL(true) 开启SQL日志,执行一次Insert和一次Get,观察生成的SQL是否包含目标字段名。

















