环境搭建命令
引入gorm 和 mysql-driver
首先需要导入依赖,我使用的是gorm2,所以没有jinzhu做开头
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
连接数据库
//连接mysql数据库的核心代码
dsn := "root:root123456@tcp(192.168.157.129:3306)/tiktok?&parseTime=True"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
其中:
root 为mysql用户名
root123456 为mysql密码
192.168.157.129 为我安装mysql服务的Linux虚拟机的ip地址,当然也可以修改为localhost或其他ip地址
3306没什么好说的,mysql的默认端口
创建对应表中数据的结构体
// User 用户实体类
// 唯一联合索引 Username -> Password
type User struct {
Username string `gorm:"size:32;uniqueIndex:idx_username_password"`
Password string `gorm:"size:32;uniqueIndex:idx_username_password"`
Avatar string `gorm:"size:255"`
BackgroundImage string `gorm:"size:255"`
Signature string `gorm:"size:200"`
gorm.Model
}
其中Username,Password等字段需要遵循gorm的规则大写首字母,gorm默认字段名的蛇形命名即表中的列名,如BackgroundImage对应了表中的background_image。gorm默认表名对应结构体名的蛇形复数对于User结构体即为users。
如果不喜欢这样的对应关系,您也可以通过gorm文档中提供的方式进行修改(表名和字段名的约束和修改可以参照官方文档-约束),此处我使用gorm的迁移技术建表,故不作修改。
这里我再结构体的每个字段后面都添加了gorm所提供的标签,这是实现gorm AutoMigrate建表的重要手段。gorm标签的格式为\
`gorm:"内容"`
以上方User用户实体类,Username字段为例,右侧的标签所展示的那样,当我们需要使用多个标签时,可以使用分号进行分割。其中size:32
表示列中存储的数据长度为32,对应的就是mysql数据库中的varchar(32),主要用于字符串类型。uniqueIndex:idx_username_password
表示给Username字段添加唯一索引,我给Username和Password都添加了该标签,表示创建联合唯一索引idx_username_password,索引的数据依次为username,password。
索引数据的顺序会影响查询效率,那么为什么是Username,Password的顺序而不是Password,Username的顺序呢?
这是因为gorm中字段的默认优先级都为10(数字越小越优先)。当我们不指定字段的优先级时,谁最靠前,谁越优先,如果我们将Password的标签改为
`gorm:"size:32;uniqueIndex:idx_username_password;priority:1"`
索引就会变成password,username的顺序了。具体可以参考数据库索引 和 模型定义
那么gorm.Model是什么呢?下面是gorm源码中对gorm.Model的定义。ID即是数据库中的主键id,CreateTime和UpdateTime也就是创建和更新时间,DeleteAt则是用于软删除的字段。引入了gorm.Model,就可以让gorm替我们实时更新createTime和updateTime,并让gorm进行软删除操作的支持。
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
如果您不想引入这么多字段,也可以只往结构体中加入这其中的字段,比如添加DeleteAt gorm.DeleteAt到结构体中就可以实现软删除的效果,像这样。CreateTime和UpdateTime也同样得到gorm的支持,只要加进去就可以让gorm代为管理
// User 用户实体类
// 唯一联合索引 Username -> Password
type User struct {
Username string `gorm:"size:32;uniqueIndex:idx_username_password"`
Password string `gorm:"size:32;uniqueIndex:idx_username_password"`
Avatar string `gorm:"size:255"`
BackgroundImage string `gorm:"size:255"`
Signature string `gorm:"size:200"`
DeleteAt gorm.DeleteAt `gorm:"index"`
}
当我们完成工作之后,只需要进行最后一步
// InitTables 初始化数据表格
func InitTables() {
//model是包名,User是结构体名
err := DB.AutoMigrate(&model.User{}) //这里可以有很多个结构体
if err != nil {
fmt.Println("autoMigrate error !!!")
return
}
}
调用AutoMigrate方法,就可以在数据库中根据您所定义的结构体信息建表了。这一方法可以参考官方文档-迁移