XORM中结构体映射表名有三种方式:1. 实现TableName()方法显式指定;2. 调用SetTableMapper设置全局映射规则;3. 使用engine.Table()临时覆盖。需注意调用时机与作用范围。

在XORM中让结构体准确对应数据库表名,是避免Sync2建表失败或操作错表的前提。手动指定表名比依赖命名规则更可靠,尤其当表名含特殊前缀、大小写混用或与Go标识符规范冲突时。
用TableName()方法显式声明表名
在结构体中定义一个名为TableName的无参方法,返回string类型值,XORM会优先采用该返回值作为表名,完全绕过全局映射规则。
func (u User) TableName() string { return "user_info" }
这一步必须写在结构体定义所在的包内,且方法接收者类型需与结构体一致(指针或值类型均可,但需统一)。如果结构体嵌套了其他结构体,嵌套结构体的TableName方法不会被自动调用。
注意:该方法返回的字符串【不经过任何映射处理】,即你写"user_info",XORM就用"user_info",不会转成user_info或USER_INFO。
通过SetTableMapper切换表名映射规则
全局控制结构体名到表名的转换逻辑,适用于批量适配已有数据库表命名习惯的场景。
方法一:使用SameMapper → 表名与结构体名完全一致
engine.SetTableMapper(core.SameMapper{})
此时User结构体对应表user,UserOrder对应表UserOrder(原样保留大小写)。
方法二:使用SnakeMapper → 驼峰转下划线
engine.SetTableMapper(core.SnakeMapper{})
UserOrder → user_order,APIKey → a_p_i_key(注意ID类缩写会被拆开)。
方法三:使用GonicMapper → 更智能的驼峰转小写
engine.SetTableMapper(core.GonicMapper{})
UserOrder → user_order,APIKey → api_key(ID/URL等常见缩写直接转为小写,不加下划线)。
【关键前提】SetTableMapper必须在engine.Sync2()或首次执行SQL前调用,否则无效。
用engine.Table()临时覆盖表名
第一步:定义原始结构体,不带任何表名逻辑
type Product struct { ID int64 `xorm:"pk autoincr"` Name string }
第二步:执行查询或同步时,用engine.Table("goods")指定目标表
err := engine.Table("goods").Sync2(new(Product))
第三步:后续所有对该结构体的操作(Insert/Get/Find等),只要不重新调用Table(),都默认作用于"goods"表
_, err = engine.Table("goods").Insert(&Product{Name: "Laptop"})
这个方式适合灰度迁移或同一结构体映射多张历史表的场景,但无法用于CreateTables()批量建表——它只影响单次操作上下文。


















