Gorm框架 模型定义

Gorm 框架操作数据库需要预先定义数据模型,数据模型的主要作用是充当操作数据库的媒介。

例如,使用 Gorm 操作数据库:

  • 从数据库读取的数据会先保存到预先定义的模型对象,然后我们就可以从模型对象得到我们想要的数据。
  • 插入数据到数据库也是先新建一个模型对象,然后把想要保存的数据先保存到模型对象,然后把模型对象保存到数据库。

在 Go 语言中 Gorm 模型定义是通过 struct 实现的,这样我们就可以通过 Gorm 库实现 struct 类型和 Mysql 表数据的映射。

Gorm 负责将对模型的读写操作翻译成 sql 语句,然后 Gorm 再把数据库执行 sql 语句后返回的结果转化为我们定义的模型对象。

 

1. Gorm 模型的定义

Gorm 模型定义主要就是在 struct 类型定义的基础上增加字段标签说明实现。

假如有个商品表,表结构如下:

CREATE TABLE `food` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID,商品Id',
  `name` varchar(30) NOT NULL COMMENT '商品名',
  `price` decimal(10,2) unsigned  NOT NULL COMMENT '商品价格',
  `type_id` int(10) unsigned NOT NULL COMMENT '商品类型Id',
  `createtime` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
   PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8

模型定义如下:

// 字段注释说明了Gorm 把 struct 字段转换为表字段名长什么样子。
type Food struct {
	Id         int  // 表字段名为:id
	Name       string // 表字段名为:name
	Price      float64 // 表字段名为:price
	TypeId     int  // 表字段名为:type_id
	// 字段定义后面使用两个反引号``包裹起来的字符串部分叫做标签定义,这个是 golang 的基础语法,不同的库会定义不同的标签,有不同的含义
	CreateTime int64 `gorm:"column:createtime"`  // 表字段名为:createtime
}

默认 Gorm 对 struct 字段名使用 Snake Case 命名风格转换成 Mysql 表字段名(需要转换成小写字母)。根据 Gorm 的默认约定,上面例子只需要使用 gorm:"column:createtime" 标签定义为CreateTime 字段指定表字段名,其他使用默认值即可。

Snake Case 命名风格,就是各个单词之间用下划线(_)分隔,例如: CreateTime的Snake Case风格命名为create_time。

 

2. Gorm 模型的标签

通过上面的例子,大家看到可以通过类似 gorm:"column:createtime" 这样的标签定义语法,定义 struct 字段的列名(表字段名)。

gorm标签语法:gorm:"标签定义"

标签定义部分,多个标签定义可以使用分号(;)分隔。

例如,定义列名:

语法格式:gorm:"column:列名"。

Gorm 常用标签如下:

标签说明例子
column指定列名gorm:"column:createtime"
primaryKey指定主键gorm:"column:id; PRIMARY_KEY"
-忽略字段gorm:"-" 可以忽略struct字段,被忽略的字段不参与gorm的读写操作

 

3. Gorm 模型定义表名

可以通过定义 struct 类型的 TableName 函数实现定义模型的表名。

// 设置表名,可以通过给 Food struct 类型定义 TableName 函数,返回一个字符串作为表名
func (v Food) TableName() string {
	return "food"
}

建议: 默认情况下都给模型定义表名,有时候定义模型只是单纯的用于接收手写Sql 查询的结果,这个时候是不需要定义表名;手动通过 Gorm 函数 Table() 指定表名,也不需要给模型定义 TableName 函数。

 

4. gorm.Model 结构体

Gorm 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt。

// gorm.Model 的定义
type Model struct {
  ID        uint   `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

将它嵌入到我们的结构体中,就可以包含这几个字段,类似继承的效果。

type User struct {
  gorm.Model // 嵌入gorm.Model的字段
  Name string
}

 

5. 自动更新时间

Gorm 约定使用 CreatedAt、UpdatedAt 追踪创建/更新时间。如果定义了这种字段,Gorm 在创建、更新时会自动填充当前时间。

要使用不同名称的字段,您可以配置 autoCreateTime、autoUpdateTime 标签

如果想要保存 UNIX(毫/纳)秒时间戳,而不是 time,只需简单地将 time.Time 修改为 int 即可。

type User struct {
  CreatedAt time.Time // 默认创建时间字段, 在创建时,如果该字段值为零值,则使用当前时间填充
  UpdatedAt int       // 默认更新时间字段, 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充
  Updated   int64 `gorm:"autoUpdateTime:nano"` // 自定义字段, 使用时间戳填纳秒数充更新时间
  Updated   int64 `gorm:"autoUpdateTime:milli"` //自定义字段, 使用时间戳毫秒数填充更新时间
  Created   int64 `gorm:"autoCreateTime"`      //自定义字段, 使用时间戳秒数填充创建时间
}

Gorm 支持多种数据库,包括互联网应用通常使用的 Mysql 数据库。连接 Mysql 主要有两个步骤:配置 DSN (Data Source Name);使用 gorm.Open 连接数据库。配置 DSN (Data Source Name):Gorm 使用 dsn 作为连接数据库的参数,dsn 翻译过来就叫数据源名称,用来描述数据库连接信息。一般都包含数据库连接地址,账号,密码之类的信息。