名称映射规则
名称映射规则主要负责结构体名称到表名和结构体field到表字段的名称映射。由core.IMapper接口的实现者来管理,xorm内置了三种IMapper实现:core.SnakeMapper , core.SameMapper和core.GonicMapper。SnakeMapper支持struct为驼峰式命名,表结构为下划线命名之间的转换;SameMapper支持结构体名称和对应的表名称以及结构体field名称与对应的表字段名称相同的命名。
当前SnakeMapper为默认值,如果需要改变时,在engine创建完成后使用
engine.SetMapper(core.SameMapper{})
使用Table和Tag改变名称映射
- 如果结构体拥有
TableName() string
的成员方法,那么此方法的返回值即是该结构体对应的数据库表名。 - 通过
engine.Table()
方法可以改变struct对应的数据库表的名称,通过sturct
中field
对应的Tag
中使用xorm:"'column_name'"
可以使该field对应的Column
名称为指定名称。这里使用两个单引号将Column
名称括起来是为了防止名称冲突,因为我们在Tag中还可以对这个Column
进行更多的定义。如果名称不冲突的情况,单引号也可以不使用。
到此名称映射的所有方法都给出了,一共三种方式,这三种是有优先级顺序的。表名的优先级顺序如下:
engine.Table()
指定的临时表名优先级最高TableName() string
其次Mapper
自动映射的表名优先级最后
字段名的优先级顺序如下:
- 结构体
tag
指定的字段名优先级较高 Mapper
自动映射的表名优先级较低
Column属性定义
我们在field对应的Tag中对Column的一些属性进行定义,定义的方法基本和我们写SQL定义表结构类似,比如:
type User struct {
Id int64
Name string `xorm:"varchar(25) notnull unique 'usr_name'"`
}
具体的Tag规则如下,另Tag中的关键字均不区分大小写,但字段名根据不同的数据库是区分大小写:
tag | 说明 |
---|---|
name | 当前field对应的字段的名称,可选,如不写,则自动根据field名字和转换规则命名,如与其它关键字冲突,请使用单引号括起来。 |
pk | 是否是Primary Key,如果在一个struct中有多个字段都使用了此标记,则这多个字段构成了复合主键,单主键当前支持int32,int,int64,uint32,uint,uint64,string这7种Go的数据类型,复合主键支持这7种Go的数据类型的组合。 |
autoincr | 是否是自增 |
[not ]null 或 notnull | 是否可以为空 |
unique或unique(uniquename) | 是否是唯一,如不加括号则该字段不允许重复;如加上括号,则括号中为联合唯一索引的名字,此时如果有另外一个或多个字段和本unique的uniquename相同,则这些uniquename相同的字段组成联合唯一索引 |
index或index(indexname) | 是否是索引,如不加括号则该字段自身为索引,如加上括号,则括号中为联合索引的名字,此时如果有另外一个或多个字段和本index的indexname相同,则这些indexname相同的字段组成联合索引 |
created | 这个Field将在Insert时自动赋值为当前时间 |
updated | 这个Field将在Insert或Update时自动赋值为当前时间 |
deleted | 这个Field将在Delete时设置为当前时间,并且当前记录不删除 |
- | 这个Field将不进行字段映射 |
另外有如下几条自动映射的规则:
- 1.如果
field
名称为Id
而且类型为int64
并且没有定义tag
,则会被xorm
视为主键,并且拥有自增属性。如果想用Id
以外的名字或非int64
类型做为主键名,必须在对应的Tag
上加上xorm:"pk"
来定义主键,加上xorm:"autoincr"
作为自增。这里需要注意的是,有些数据库并不允许非主键的自增属性。 - 2.
string
类型默认映射为varchar(255)
,如果需要不同的定义,可以在tag中自定义,如:varchar(1024)
https://www.kancloud.cn/kancloud/xorm-manual-zh-cn/56004