最近做项目用xorm操作用友T3的sql sever数据库时,出现表映射的问题,如客户分类,对应的golang是 type CustomerClass struct,直接用XORM操作操作的表是“customer_class”,而用友的数据库名是“customerClass”。这样就导致无法对用友数据库进行操作。 xorm有三种名称映射规则:
- core.SnakeMapper 支持struct为驼峰式命名,表结构为下划线命名之间的转换,这个是默认的Maper。如customer_class。
- core.SameMapper 支持结构体名称和对应的表名称以及结构体field名称与对应的表字段名称相同的命名。如CustomerClass。
- core.GonicMapper 和SnakeMapper很类似,但是对于特定词支持更好,比如ID会翻译成id而不是i_d。
在engine创建完成后使用:
engine.SetMapper(core.SameMapper{})
表名称和字段名称的映射规则默认是相同的,当然也可以设置为不同,如: engine.SetTableMapper(core.SameMapper{})//表 engine.SetColumnMapper(core.SnakeMapper{})//字段
但这没有解决我的问题。然后我发现了xorm自带的Table。 使用Table和Tag改变名称映射 如果所有的命名都是按照IMapper的映射来操作的,那当然是最理想的。但是如果碰到某个表名或者某个字段名跟映射规则不匹配时,我们就需要别的机制来改变。xorm提供了如下几种方式来进行:
如果结构体拥有TableName() string的成员方法,那么此方法的返回值即是该结构体对应的数据库表名。
通过engine.Table()方法可以改变struct对应的数据库表的名称,通过sturct中field对应的Tag中使用xorm:"'column_name'"可以使该field对应的Column名称为指定名称。这里使用两个单引号将Column名称括起来是为了防止名称冲突,因为我们在Tag中还可以对这个Column进行更多的定义。如果名称不冲突的情况,单引号也可以不使用。
到此名称映射的所有方法都给出了,一共三种方式,这三种是有优先级顺序的。
表名的优先级顺序如下:
engine.Table() 指定的临时表名优先级最高 TableName() string 其次 Mapper 自动映射的表名优先级最后 字段名的优先级顺序如下:
结构体tag指定的字段名优先级较高 Mapper 自动映射的表名优先级较低