我们在field对应的Tag中对Column的一些属性进行定义,定义的方法基本和我们写SQL定义表结构类似,比如:
type User struct { Id int64 Name string `xorm:"varchar(25) notnull unique 'usr_name'"` }
对于不同的数据库系统,数据类型其实是有些差异的。因此xorm中对数据类型有自己的定义,基本的原则是尽量兼容各种数据库的字段类型,具体的字段对应关系可以查看字段类型对应表。对于使用者,一般只要使用自己熟悉的数据库字段定义即可。
具体的Tag规则如下,另Tag中的关键字均不区分大小写,但字段名根据不同的数据库是区分大小写:
另外有如下几条自动映射的规则:
1.如果field名称为Id而且类型为int64并且没有定义tag,则会被xorm视为主键,并且拥有自增属性。如果想用Id以外的名字或非int64类型做为主键名,必须在对应的Tag上加上xorm:"pk"来定义主键,加上xorm:"autoincr"作为自增。这里需要注意的是,有些数据库并不允许非主键的自增属性。
Id
int64
xorm:"pk"
xorm:"autoincr"
2.string类型默认映射为varchar(255),如果需要不同的定义,可以在tag中自定义,如:varchar(1024)
varchar(255)
varchar(1024)
3.支持type MyString string等自定义的field,支持Slice, Map等field成员,这些成员默认存储为Text类型,并且默认将使用Json格式来序列化和反序列化。也支持数据库字段类型为Blob类型。如果是Blob类型,则先使用Json格式序列化再转成[]byte格式。如果是[]byte或者[]uint8,则不做转换二十直接以二进制方式存储。具体参见 Go与字段类型对应表
type MyString string
4.实现了Conversion接口的类型或者结构体,将根据接口的转换方式在类型和数据库记录之间进行相互转换,这个接口的优先级是最高的。
type Conversion interface { FromDB([]byte) error ToDB() ([]byte, error) }
5.如果一个结构体包含一个Conversion的接口类型,那么在获取数据时,必须要预先设置一个实现此接口的struct或者struct的指针。此时可以在此struct中实现BeforeSet(name string, cell xorm.Cell)方法来进行预先给Conversion赋值。例子参见 testConversion
BeforeSet(name string, cell xorm.Cell)
下表为xorm类型和各个数据库类型的对应表:
<tr> <td>BIT </td> <td>BIT </td> <td>INTEGER </td> <td>BIT </td> <td></td> </tr> <tr> <td>TINYINT </td> <td>TINYINT </td> <td>INTEGER </td> <td>SMALLINT </td> <td></td> </tr>
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8