本文介绍模型定义常用方法: 基本操作本文都可以满足。更加详细内容参考
ORM框架操作数据库,需要预先定义模型,模型可以理解成数据模型,作为操作数据库的媒介。
例如:
-
从数据库读取数据会先保存到预先定义模型对象,然后就可以从模型对象中得到想要的数据。
-
插入数据到数据库需新建一个模型对象,然后把想要保存的数据保存到模型对象,再将模型对象保存到数据库。
在golang中gorm模型定义是通过struct实现的,这样我们就可以通过gorm库实现struct类型和mysql表数据的映射。
gorm负责将对模型读写操作翻译成sql语句,然后gorm再把数据库执行sql语句后返回结果转化为预先定义的模型对象。
gorm****模型定义
gorm模型定义,主要就是在struct类型定义基础上增加字段标签说明实现,下面看个完整的例子。
例如:有用户表,表结构如下
CREATE TABLE `user` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`age` int unsigned NOT NULL,
`name` varchar(40) NOT NULL,
`createtime` int(10) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb3 |
模型定义如下
type User struct {
Id int //表字段名为:id
Age int //表字段名为:name
Name string //表字段名为:price
CreateTime int64 `gorm:"column:createtime"` //表字段名为:createtime
}
默认gorm对struct字段名使用Snake Case命名风格转换成mysql表字段名(需要转换成小写字母)。
根据gorm的默认约定,上面例子只需要使用gorm:"column:createtime"标签定义为CreateTime字段指定表字段名,其他使用默认值即可。
提示:Snake Case命名风格,就是各个单词之间用下划线(_)分隔,例如: CreateTime的Snake Case风格命名为create_time
gorm****模型标签
通过上面的例子,大家看到可以通过类似gorm:"column:createtime"这样的标签定义语法,定义struct字段的列名(表字段名)。
gorm标签语法:gorm:"标签定义"
标签定义部分,多个标签定义可以使用分号(;)分隔
例如定义列名:
gorm:"column:列名"
gorm常用标签如下:
定义表名
可以通过定义struct类型的TableName函数实现定义模型的表名
接上面的例子:
//设置表名,可以通过给Food struct类型定义 TableName函数,返回一个字符串作为表名
func (v User) TableName() string {
return "food"
}
默认情况下都给模型定义表名,有时候定义模型只是单纯的用于接收手写sql查询的结果,这个时候是不需要定义表名;手动通过gorm函数Table()指定表名,也不需要给模型定义TableName函数。
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
}
自动更新时间
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"` //自定义字段, 使用时间戳秒数填充创建时间
}