之前简介了gorm如何对mysql中的表数据如何增删改查。这里主要介绍一下gorm的模型描述。
什么是模型?举个简单的例子,在售楼部,售楼部的营业员,在给客人讲解小区规划和户型的时候,通常会在售楼中心一个将小区缩小数倍后,跟小区形状很相似的沙盘模型给你讲解。这是小区和房屋的模型。而在科研类的领域里面,原物本身就没有实体,那该如何建立它的模型呢?
无论是小区还是房屋,之所以能够建立它的模型,是因为我们将小区或者房屋的形状中的关键点给记录下来,比如大楼外墙的颜色,长、宽、高、层数窗户、门的数量,及其分别所在位置等。有了这些数据,我们按照既定的比例,使用一些适用建模的材料,就可以制作出对应比例的模型出来。数据库虽然没有实体,但也有其特征点。比如每个数据库中,有表、视图、索引、主键、外键等元素,每张表中,有若干个字段,每个字段,其类型也是在固定范围中的某一种,数据库还有名称、表名称、字段名称等元素。诸如此类等等,这些都是我们建立数据库模型的依据。
在go语言中,定义字段时,如果是小写开头,则该字段为私有属性,不可被外部访问,只有首字母为大写的字段,才可被外部定义的变量,才可被外部访问。而数据库中的表名、字段名,在go模型中如何定义才能被正确接收呢?go语言为我们提供了一种解决方案,就是在定义变量的时候,可以额外的为其打上标签,即使标签为go的关键字,也可以被正确解析。例如:
type Order struct {
Id int64 `gorm:"column:id;primaryKey;autoIncrement"`
OrderId string `gorm:"column:order_id;type:varchar(50)"` //订单号
ContactName string `gorm:"column:contact_name;type:varchar(200)"` //联系人姓名
ContactAreaCode string `gorm:"column:contact_area_code;type:varchar(20)"` //联系人电话区号,若未提供则默认86
ContactPhone string `gorm:"column:contact_phone;type:varchar(50)"` //联系人电话
ContactEmail string `gorm:"column:contact_email;type:varchar(50)"` //联系人邮箱
ContactAddress string `gorm:"column:contact_address;type:varchar(200)"` //联系人地址
ContactPostCode string `gorm:"column:contact_post_code;type:varchar(20)"` //联系人邮编
Status string `gorm:"column:status;type:varchar(20)"` //订单状态。占座中|占座成功|占座失败|支付中|支付成功|支付失败|出票成功|出票失败|已取消
Async int `gorm:"column:async;type:int"` //是否异步。1:异步;0:同步
Remarks string `gorm:"column:remarks;type:varchar(4000);NULL"` //订单备注信息,占座失败,或者出票失败,可以用来记录原因
CreateTime time.Time `gorm:"column:create_time;type:datetime"` //记录创建时间
UpdateTime time.Time `gorm:"column:update_time;type:datetime"` //记录更新时间
}
在上述示例中,变量的标签定义是放在每个变量类型之后的部分。以'`'(注:不是单引号',而是键盘左上区'1'左边的`键)开头,同时以'`'结束,中间不可再出现'`'。在go中,标签不止可以用来描述gorm对应的数据模型内容,也可以用来描述json、orm、ymal等多种模型内容,甚至可以放在一起分别描述不同模型的内容。例如:
OrderId string `gorm:"column:order_id;type:varchar(50)" json:"orderId"`
描述模型时,模型与模型之前用空格隔开,每个模型的开头是模型名称,比如gorm、orm、json等。模型名称后面用英语半角冒号隔开,模型的具体内容用双引号引起来。要描述的属性不止一个,则用英语半角';'隔开。
上面的OrderId这个变量,我们就理解为。在mysql中,它表示一个名称为order_id的字段,其类型为varchar(50),同时它表示为json时,在json数据中,字段名称为orderId。
详细的gorm标签用法,可以在其官网https://gorm.io/zh_CN/docs/models.html中查看。这里只介绍一些常用的标签。
- column 字段名称
- type 字段类型。其值与数据库中的基本保持一致。比如:varchar(200)、int(10)、datetime等
- autoIncrement 字段自增,通常用在主键id上面
- primaryKey 设定字段为主键
- comment 字段描述信息
- index 复合索引,多字段的索引名相同,则为复合索引
- uniqueIndex 惟一索引。
这里注意一下,在使用column、index关键字时,后面还得加上对应的字段名、索引名,比如:column:order_id;index:idx_order_id。但autoIncrement和primaryKey这两个关键字直接使用,不需要再接冒号,描述信息了。