xorm之定义表结构体

xorm支持将一个struct映射为数据库中对应的一张表。

文章目录

  • xorm 通过结构体获取到 表名
  • xorm自动生成对应结构体
  • 名称映射规则
  • 前缀映射,后缀映射和缓存映射
  • 使用Table和Tag改变名称映射
  • Column属性定义

xorm 通过结构体获取到 表名

var engine *xorm.Engine

engine.TableName(new(表结构体),true)

xorm自动生成对应结构体

xorm reverse mssql "server=192.168.133.133;database=arguse;user id=sa;password=123456;encrypt=disable" E:\Go\GOPATH\src\github.com\go-xorm\cmd\xorm\templates\goxorm

名称映射规则

名称映射规则主要负责结构体名称到表名和结构体field到表字段的名称映射。由core.IMapper接口的实现者来管理,xorm内置了三种IMapper实现:core.SnakeMappercore.SameMapper,和core.GonicMapper

  • SnakeMapper 支持struct为驼峰式命名,表结构为下划线命名之间的转换,这个是默认的Maper;
  • SameMapper 支持结构体名称和对应的表名称以及结构体field名称与对应的表字段名称相同的命名;
  • GonicMapper 和SnakeMapper很类似,但是对于特定词支持更好,比如ID会翻译成id而不是i_d

当前SnakeMapper为默认值,如果需要改变时,在engine创建完成后使用

engine.SetMapper(core.SameMapper{})

同时需要注意的是:

  • 如果你使用了别的命名规则映射方案,也可以自己实现一个IMapper。
  • 表名称和字段名称的映射规则默认是相同的,当然也可以设置不同,如:
engine.SetTableMapper(core.SameMapper{})
engine.SetColumnMapper(core.SnakeMapper{})

xorm之定义表结构体_第1张图片

前缀映射,后缀映射和缓存映射

  • 通过core.NewPrefixMapper(core.SnakeMapper{}, "prefix") 可以创建一个在SnakeMapper的基础上在命名中添加统一的前缀,当然也可以把SnakeMapper{}换成SameMapper或者你自定义的Mapper。

例如:如果希望所有的表名都在结构体自动命名的基础上加一个前缀而字段名不加前缀,则可以在engine创建完成之后执行一下语句。

执行之后,结构体type User struct 默认对应的表名就变成了 prefix_user了,而之前默认的是user

  • 通过 core.NewSufffixMapper(core.SnakeMapper{}, “suffix”) 可以创建一个在SnakeMapper的基础上在命名中添加统一的后缀,当然也可以把SnakeMapper换成SameMapper或者你自定义的Mapper。

  • 通过 core.NewCacheMapper(core.SnakeMapper{}) 可以创建一个组合了其它的映射规则,起到在内存中缓存曾经映射过的命名映射。

使用Table和Tag改变名称映射

如果所有的命名都是按照IMapper的映射来操作的,那当然是最理想的。但是如果碰到某个表名或者某个字段名跟映射规则不匹配时,我们就需要别的机制来改变。xorm提供了如下几种方式来进行。

  • 如果结构体拥有TableName() string的成员方法,那么此方法的返回值即是该结构体对应的数据库表名。
  • 通过engine.Table()方法可以改变strut对应的数据库表的名称,通过struct中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'"`
}

对于不同的数据库系统,数据类型其实是有些差异的。因此xorm中对数据类型有自己的定义,基本的原则是尽量兼容各种数据库的字段类型,具体的字段对应关系可以查看字段类型对应表。对于使用者,一般只要使用自己熟悉的数据库字段定义即可。

具体的Tag规则如下,另Tag中的关键字均不区分大小写,但字段名根据不同的数据库是区分大小写:

name 当前field对应的字段的名称,可选,如不写,则自动根据field名字和转换规则命名,如与其它关键字冲突,请使用单引号括起来。
pk 是否是Primary Key,如果在一个struct中有多个字段都使用了此标记,则这多个字段构成了复合主键,单主键当前支持int32,int,int64,uint32,uint,uint64,string这7种Go的数据类型,复合主键支持这7种Go的数据类型的组合。
当前支持30多种字段类型,详情参见本文最后一个表格 字段类型
autoincr 是否是自增
[not ]null 或 notnull 是否可以为空
unique或unique(uniquename) 是否是唯一,如不加括号则该字段不允许重复;如加上括号,则括号中为联合唯一索引的名字,此时如果有另外一个或多个字段和本unique的uniquename相同,则这些uniquename相同的字段组成联合唯一索引
index或index(indexname) 是否是索引,如不加括号则该字段自身为索引,如加上括号,则括号中为联合索引的名字,此时如果有另外一个或多个字段和本index的indexname相同,则这些indexname相同的字段组成联合索引
extends 应用于一个匿名成员结构体或者非匿名成员结构体之上,表示此结构体的所有成员也映射到数据库中,extends可加载无限级
- 这个Field将不进行字段映射
-> 这个Field将只写入到数据库而不从数据库读取
<- 这个Field将只从数据库读取,而不写入到数据库
created 这个Field将在Insert时自动赋值为当前时间
updated 这个Field将在Insert或Update时自动赋值为当前时间
deleted 这个Field将在Delete时设置为当前时间,并且当前记录不删除
version 这个Field将会在insert时默认为1,每次更新自动加1
default 0或default(0) 设置默认值,紧跟的内容如果是Varchar等需要加上单引号
json 表示内容将先转成Json格式,然后存储到数据库中,数据库中的字段类型可以为Text或者二进制

另外有如下几条自动映射的规则:

  • 如果field名称为Id而且类型为int64并且没有定义tag,则会被xorm视为主键,并且拥有自增属性。如果想用Id以外的名字或非int64类型做为主键名,必须在对应的Tag上加上xorm:"pk"来定义主键,加上xorm:"autoincr"作为自增。这里需要注意的是,有些数据库并不允许非主键的自增属性。
  • string类型默认映射为varchar(255),如果需要不同的定义,可以在tag中自定义,如:varchar(1024)
  • 支持type MyString string等自定义的field,支持Slice, Map等field成员,这些成员默认存储为Text类型,并且默认将使用Json格式来序列化和反序列化。也支持数据库字段类型为Blob类型。如果是Blob类型,则先使用Json格式序列化再转成[]byte格式。如果是[]byte或者[]uint8,则不做转换二十直接以二进制方式存储。具体参见 Go与字段类型对应表
  • 实现了Conversion接口的类型或者结构体,将根据接口的转换方式在类型和数据库记录之间进行相互转换,这个接口的优先级是最高的。
type Conversion interface {
    FromDB([]byte) error
    ToDB() ([]byte, error)
}
  • 如果一个结构体包含一个Conversion的接口类型,那么在获取数据时,必须要预先设置一个实现此接口的struct或者struct的指针。此时可以在此struct中实现BeforeSet(name string, cell xorm.Cell)方法来进行预先给Conversion赋值。例子参见 testConversion

原文地:http://www.xorm.io/docs/

你可能感兴趣的:(#,golang)